読者です 読者をやめる 読者になる 読者になる

pipe

pipeは、プロセス間通信に使う名前なしパイプを生成するシステムコール・・・。

Man page of PIPE

引数には要素数2のint型配列を渡す・・・。0番目が読み込み用、1番目が書き込み用に使われる・・・。
主に、親プロセスと子プロセスの間でのプロセス間通信に使う・・・。
今回は、親プロセスも子プロセスも読み書き両方するので、これをさらに2つ用意する・・・。

pipe.cで、

pipe1は親が書き込むパイプ(子は読み込む)、pipe2は子が書き込むパイプ(親は読み込む)・・・。

fork前に自分のプロセスIDを取得・・・。

pipeでpipe1とpipe2を作成・・・。

forkします・・・。
失敗した場合はすべてのパイプを閉じて終了・・・。

forkした後の、親の処理・・・。
親子のプロセスIDを出力したら、3秒後にpipe1[1]に書き込み・・・。
"parent written!~"という感じで、~を書き込んだことを出力・・・。
で9秒待つ・・・。
その後、pipe2[0]を読み込む・・・。
"parent read!~"の後に、子が書き込んだ文字列が入っているはず・・・。
読み込んだ文字列を出力したら、子が終るまでwaitで待つ・・・。
で子のプロセスID、親のプロセスIDを出力・・・。

子はプロセスIDを出力したら、6秒後にpipe1[0]を読み込む・・・。
"child read!~"で、親からの書き込み文字列が見える・・・。
その3秒後にpipe2[1]に書き込んで、
"child written!~"で書き込んだ文字列を見せる・・・。
で5秒待って子は終了・・・。

実行すると、

$ gcc pipe.c -o pipe
$ ./pipe
pid = 14378
I am parent!, getpid = 14378, child = 14379
I am child!, getpid = 14379

最初はこうで、3秒後に、

parent written!, I am parent! Are you child?

また3秒後に、

child read!, I am parent! Are you child?

また3秒後に、

child written!, I am child! Are you parent?

また3秒後に、

parent read!, I am child! Are you parent?

で最後は、

14379 finished!
getpid() = 14378
$

こんな感じ・・・。
親が書き込んだ文字列が子供側で読めているし、子が書いた文字列も親が読めてるので、プロセス間通信になってる・・・。

Sample/unixsyscall/pipe/pipe/src/pipe at master · bg1bgst333/Sample · GitHub