C での Linux Popen システム コール

C Deno Linux Popen Shisutemu Koru



popen() 関数は、文字列のコマンドで指定されたコマンドを実行します。この関数は、パイプへの読み取りまたは書き込みに使用されるストリームへのポインターを返す必要があり、呼び出し元のアプリケーションと実行されたコマンドの間にパイプを作成する必要もあります。 Popen 関数 は、I/O 関数 の標準ライブラリで利用でき、端末コマンドを実行するための 2 番目のプロセスを生成します。 popen() のオープン フェーズは、fopen() 関数のオープン フェーズと同じです。 popen() 関数は、フォーク、パイプの構築、およびシェルの実行によってプロセスを開始します。パイプはデフォルトで単方向であるため。その結果、ストリームは読み取り専用または書き込み専用になります。 popen() 関数が正常に実行されると、パイプが読み書きするために使用されるオープン ストリームが取得されます。

例 1

次のプログラム例では、popen システム コールを使用して、現在のディレクトリまたはフォルダーに存在するファイルを読み取ります。まず、C 標準ライブラリの stdio.h ヘッダー ファイルを入力しました。次に、popen 関数をデプロイしたプログラム int main()function があります。この前に、クラス「FILE」からポインター変数「FileOpen」を確立しました。ファイルのポインタ変数は、読み書きする後続のバイトを示します。







その後、読み取るキャラクターの限界値を割り当てました。次に、変数「FileOpen」が「popen」関数を呼び出しました。 「popen」機能は、Linux の「ls -l」コマンドを使用します。このコマンドは、現在のディレクトリのすべてのファイルを一覧表示します。さらに、読み取りモードを示す「r」パラメーターを popen 関数に入力しました。



ここでは、popen 関数を利用して、ファイルの読み取りプロセスをパイプ処理しました。次に、作成したパイプを while ループで処理しました。 while ループは fgets メソッドを使用します。このメソッドは引数「line」、「sizeof the line」、および「FileOpen」を取ります。 fgets は、パイプ処理されたプロセスを読み取り、それを文字列の「%s」記号に格納しました。この特定のシンボルは、「line」引数とともに printf メソッド内で呼び出されます。 pclosed 関数を使用して処理されたパイプを作成したら、以下のプログラムの最後に、パイプされたプロセスをデプロイとして閉じることができます。



#include


int メイン ( )

{

ファイル * FileOpen;

チャーライン [ 130 ] ;


FileOpen = popen ( 'ls -l' 'r' ) ;

その間 ( fgets ( 行、行のサイズ、FileOpen ) )

{

printf ( '%s' 、 ライン ) ;

}

閉じる ( ファイル開く ) ;

}





C プログラムの popen 関数は、上記のプロセスを fork し、パイプを作成しました。これで、C コンパイル コマンドを使用して、シェルでストリームの処理済みパイプを実行しました。そのディレクトリでプログラムを実行したため、出力には「ホーム」ディレクトリ内のすべてのファイルがリストされています。



例 2

前の popen プログラムでは、ファイル読み取りのストリーミング プロセスをパイプ処理するために使用される popen プログラムの機能の簡単なデモを行いました。ここで、書き込みモードでプロセスをパイプ処理した popen 関数の別の例を取り上げました。メイン関数を持つプログラムを考えてみましょう。メイン関数内のファイル ポインタ変数を「file」として作成しました。ファイル ポインタは popen 関数で展開されます。

popen 関数は、「cat」コマンドと書き込みモードの「w」を取ります。ここでは、各 File 引数が順番に読み取られ、cat コマンドによって標準出力に送信されます。 for ループ本体では、シンボル「%d」を指定したため、fprintf 関数を使用して数値カウント値を出力しました。次に、pclose システム コールで popen パイプ プロセスを閉じます。

#include


int メイン ( int argc、char ** argv ) {

ファイル * ファイル =開く ( '猫' 'の' ) ;

整数 x = 0 ;


為に ( バツ = 0 ;バツ < 5 ;x++ ) {


fprintf ( ファイル '私の数 = %d \n ' 、 バツ ) ;
}

閉じる ( ファイル ) ;

戻る 0 ;

}

上記で作成したプロセスを実行すると、次のようにカウント値が出力されました。

例 3

これで、あるプロセスのデータを別のプロセスに転送する別のプログラムができました。 popen 関数のパイプでこれを行います。 C の標準ライブラリを使用してプログラムを実装しました。次に、プログラムを展開するための int main 関数があります。ここでは、「buffer」引数を使用して sprintf 関数で文字列を指定しました。 sprintf() 関数は、結果をプロンプトに送信するのではなく、sprintf によって提供される char バッファーに結果を保持します。

その後、「read」変数内で popen 関数を呼び出しました。そこでは、popen 関数内に 2 つのプロセスがあります。 「wc -c」は、提供された文字をカウントするために使用される最初のプロセスであり、2 番目のプロセスは、パイプが書き込みモードで開いていることを示す「w」です。その後、パイプを使用してデータを書き込む「fwrite」関数があります。データは「wc」によって受信され、文字がカウントされてシェルに表示されます。

#include

#include

#include

#include

int メイン ( )

{

ファイル * 読んだ ;

文字バッファ [ 50 ] ;

スプリント ( バッファ、 「Linux システムコール」 ) ;

読んだ =開く ( 「トイレ -c」 'の' ) ;

書き込み ( バッファ、サイズ ( チャー ) 、ストレン ( バッファ ) 読んだ ) ;

閉じる ( 読んだ ) ;

}

上記で指定した文字列には「17」文字が含まれているため、プロンプトに表示される文字は「17」です。 「wc -c」プロセスはこれらの文字を読み取り、出力として出力します。

例 4

上記の popen の例は、あるプロセスから別のプロセスにデータを送信します。ここでは、パイプを介してあるプロセスから別のプロセスにデータを受け取ります。プログラムの主な機能は、「50」の値を取るバッファを構築することです。次に、popen 関数がプロセスを作成する変数「r」を作成しました。 「ls」プロセスはディレクトリのファイルを一覧表示するために使用され、「r」プロセスはパイプからデータを読み取るために使用されます。 「ls」プロセスは、データを「r」プロセスに送信して読み取ります。この後、データを読み取り、データをバッファに格納する fread 関数があります。次に、print ステートメントは、バッファーに格納されたデータを出力します。

#include

#include

#include

#include

int メイン ( )

{

ファイル * r;

文字バッファ [ 50 ] ;


r = 開く ( 'ls' 'r' ) ;

恐れる ( バッファ、 1 25 、r ) ;


printf ( '%s \n ' 、バッファ ) ;

閉じる ( r ) ;

}

ここでは、作業ディレクトリから既存のファイルの「50」文字のみが表示されます。したがって、出力には 50 文字しかありません。

結論

C 言語での Linux popen システム コールの詳細なデモを行いました。 popen 関数をデプロイした 4 つの例を実装しました。 popen 関数は、割り当てたモードに従ってパイプ ストリームを返します。例では、ファイル処理関数 fread と fwrite で読み取りモードと書き込みモードの両方を使用しました。 popen() 関数の最初の引数としてプログラムの名前を使用しました。 2 番目の引数は、読み取りモードのファイル「r」または書き込みモードの「w」です。