プロセスとIOの概念は、一般的論理和です。親PIDに送信され、子に伝播するunix(kill)シグナルを除いて、子プロセスと親プロセスの間で交換されるシグナルはありません。
Waitpidは、子供のpidの終了を待って、ステータスコードを返します。
親と子の間でデータを交換する場合は、両方のプロセスの間にpipe
(man -s 2 pipe
参照)を作成する必要がある場合は、マニュアルページの例を参照してください。
あなたが子供にscanf
(標準入力からの入力)を使用する場合は、標準入力ファイルディスクリプタ0
(またはSTDIN_FILENO)にpipefd[0]
をバインドする必要があります。
親プロセスでselect
またはpoll
を使用して、親が送信したデータをpipefd[1]
に読み取る準備ができているかどうかを確認できます。
あなたがprintf
か(例えばSTDOUT_FILENO経由)子に書き込むためのいくつかの他のstdio.h
メソッドを使用する場合は、親のIOは、select
またはpoll
は子供がデータを受信する準備ができていると言われていても、とにかくブロックされることがあります子供が遅すぎると読んでも早すぎると出力バッファがいっぱいである(これは4096バイトのデフォルトサイズを持っています。)子供は、入力の多く(nbytes
)バイトを読んでいない場合
unistd.h
書き込み呼び出しが
nw = write(pipefd[1], buffer, nbytes);
nw < nbytes
値を返すことがあります。
したがって、非同期通信を行うときはトリップの危険性に注意してください。非同期メソッドを理解したときに、同期通信を使用する通信とは異なる、より安定したアプローチとしてCSP(通信シーケンシャルプロセス)方式をチェックしてください。
達成しようとしていることを説明した方が良いでしょう。これは奇妙なことですが、解決したい実際の問題に対するより良い解決策があります。 –
私は編集します。先端に感謝します。 – Psyny