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