パイプは、プロセス間の通信の媒体です。 1つのプロセスがパイプにデータを書き込み、別のプロセスがパイプからデータを読み取ります。この記事では、pipe()関数を使用してC言語を使用して概念を実装する方法を説明します。
パイプについて
パイプでは、データはFIFOの順序で維持されます。つまり、パイプの一方の端にデータを順番に書き込み、パイプのもう一方の端から同じ順序でデータを読み取ります。
いずれかのプロセスがパイプから読み取るが、他のプロセスがまだパイプに書き込んでいない場合、readはファイルの終わりを返します。プロセスがパイプに書き込みたいが、読み取り用にパイプに接続されている他のプロセスがない場合、これはエラー状態であり、パイプはSIGPIPE信号を生成します。
ヘッダーファイル
#含む構文
intパイプ((intfiledes[2])。
引数
この関数は、単一の引数、2つの整数の配列( filedes )。 filedes [0] パイプからの読み取りに使用され、 filedes [1] パイプへの書き込みに使用されます。パイプから読み取りたいプロセスを閉じる必要があります filedes [1]、 パイプに書き込みたいプロセスを閉じる必要があります filedes [0] 。パイプの不要な端が明示的に閉じられていない場合、ファイルの終わり(EOF)は返されません。
戻り値
成功すると、 パイプ() 0を返し、失敗した場合、関数は-1を返します。
絵画的に、私たちは表現することができます パイプ() 次のように機能します。
以下は、C言語でパイプ関数を使用する方法を示すいくつかの例です。
例1
この例では、パイプ関数がどのように機能するかを確認します。単一のプロセスでパイプを使用することはあまり有用ではありませんが、私たちはアイデアを得るでしょう。
// Example1.c#含む
#含む
#含む
#含む
int主要(()。
{{
intNS;
intfiledes[2];
charバッファ[1025];
char *メッセージ= 'こんにちは世界!';
パイプ((filedes)。;
書きます((filedes[1]、メッセージ、 strlen ((メッセージ)。)。;
もしも ((((NS=読んだ((filedes[0]、バッファ、 1024 )。 )。 > = 0)。 {{
バッファ[NS] = 0; //文字列を終了します
printf (('パイプから%dバイトを読み取ります:'%NS'NS'、NS、バッファ)。;
}
そうしないと
恐怖 (('読んだ')。;
出口 ((0)。;
}
ここでは、最初にを使用してパイプを作成しました パイプ() 次に、関数を使用してパイプに書き込まれます アイボリー[1] 終わり。次に、パイプのもう一方の端を使用してデータが読み取られました。 filedes [0] 。ファイルの読み取りと書き込みについては、以前は 読んだ() と 書きます() 関数。
例2
この例では、親プロセスと子プロセスがパイプを使用してどのように通信するかを確認します。
// Example2.c#含む
#含む
#含む
#含む
#含む
int主要(()。
{{
intfiledes[2]、nバイト;
pid_t childpid;
charストリング[] = 'こんにちは世界!NS';
char読み取りバッファ[80];
パイプ((filedes)。;
もしも((((チャイルドピッド=フォーク(()。)。 == -1)。
{{
恐怖 (('フォーク')。;
出口 ((1)。;
}
もしも((チャイルドピッド== 0)。
{{
選ぶ((filedes[0])。;//子プロセスはパイプのこの端を必要としません
/ *パイプの出力側から「文字列」を送信します* /
書きます((filedes[1]、ストリング、 (( strlen ((ストリング)。+1)。)。;
出口 ((0)。;
}
そうしないと
{{
/ *親プロセスがパイプの出力側を閉じます* /
選ぶ((filedes[1])。;//親プロセスはパイプのこの端を必要としません
/ *パイプから文字列を読み込みます* /
nバイト=読んだ((filedes[0]、読み取りバッファ、 のサイズ((読み取りバッファ)。)。;
printf (('文字列の読み取り:%s'、読み取りバッファ)。;
}
戻る((0)。;
}
最初に、パイプ関数を使用して1つのパイプが作成され、次に子プロセスがフォークされました。次に、子プロセスは読み取り側を閉じてパイプに書き込みます。親プロセスは書き込み終了を閉じ、パイプから読み取り、それを表示します。ここでのデータフローは、子から親への1つの方法にすぎません。
結論:
パイプ() Linuxの強力なシステムコールです。この記事では、一方向のデータフロー、1つのプロセスの書き込み、および別のプロセスの読み取りのみを確認し、双方向のデータフローも実現できる2つのパイプを作成しました。