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