コードが問題を引き起こした場合に親に影響を与えず、親が報告できるように、特定のコードをフォークされた子にカプセル化するコードがあります。
私は電話execの後ではありません。fork単純forkに、通常は親で実行されるコードが実行されます。
子のコードは、 と に出力しstdoutますstderr。出力のインターリーブとstdioバッファリングに問題があるため、より良い解決策を求めてTLPIを検討していました。
私が思いついたアイデアは、おおよそ次のとおりです。
pipe()ストリームごとにfork()- 子で:
close()パイプの終わりを読むdup2()stdoutおよびstderrそれぞれのファイル記述子への書き込みが終了しますsetbuf(fd, NULL)stdio子内のストリーム バッファリングをオフにします。
- 親で:
close()パイプの端を書くselect/pselect/epolletc(Linux、BSD、AIX、Solarisなどで実行する必要があります)を使用して、新しいデータのパイプの読み取り端を監視し、それがwrite()親プロセスのそれぞれのファイル記述子に直接到着したとき。
さて、私は子供dup2の中で と の間に 1 つのステップが欠けていると思います。setbufそれは何ですか?
setbufFILE*当然のことですが、にdup2作用しintます。
freopen頭に浮かびましたが、それにはパスが必要です。新しい fileno をストリームに割り当てたいだけの場合は、どうすればよいですか?