1

popenプロセス PA から (読み取り専用)プロセス PO を生成するとします。次にpclose()PA側のパイプ。

PO の側では、標準出力がまだ使用可能かどうかを判断するにはどうすればよいwrite()ですか?

PO 側で SIGPIPE をキャッチしようとしても無駄だったことに注意してください。

UPDATED :fstat(1, &buf)成功せずに使用してみました。

更新: PO を介してこの状態を検出する必要がある理由は、PA から PO の PID にアクセスできないためです (したがって、それを強制終了することはできません)。さらに、PO は、PA の障害に直面した場合、つまり単独で終了する場合に、より堅牢になることを望みます。

解決策: を使用socketpairforkました。プロセスを制御しようとするpopenことは、(少なくとも私にとっては)悪夢であることが判明しました。 貢献してくれたすべての人に感謝します!

4

2 に答える 2

2

PA は情報の消費者です (したがって、 popen() および pclose() を実行します)。

PO はプロバイダーであり、したがってサーバーです。この場合、標準出力に書き込みを行っていることしか認識していませんが、標準出力が何にバインドされているかはわかりません。したがって、この場合、PO はstdout についてあまり多くのことを知っている必要はありません。

EOF 検出は、PA プログラムで発生する必要があります。

POでそれを行う必要がある理由について、もう少し詳しく投稿していただけますか?

于 2009-11-16T21:23:34.623 に答える
2

うーん... pclose() は、パイプを閉じるに PO が終了するのを待つことになっています。その間、PO は、少なくとも 4192 バイト ( ulimit -pの 512 倍) まで、パイプの最後に書き込みを続けることができます。その後、単純にブロックする必要があります。

さらに制御したい場合は、おそらく pipe()/fork()/dup2()/close() に切り替える必要があります。これが必要な場合は、お知らせください。コードを投稿します。

于 2009-11-16T21:16:40.533 に答える