我正在編寫一個程序,它分叉多個子進程,我希望所有這些子進程都能夠寫入STDERR
和STDOUT
輸出出現亂碼。我沒有做任何奇怪的事情,只是發出以新行結束的行(至少在我的理解中是Linux的原子操作)。來自perlfaq它說:從子進程fork()和STDOUT/STDERR到控制檯
主進程和背景之一(「子」進程)共享相同的STDIN,STDOUT和STDERR文件句柄。如果兩者都試圖一次訪問它們,可能會發生奇怪的事情。您可能想要關閉或重新打開這些孩子。你可以通過打開管道來解決這個問題(見公開),但在某些系統上,這意味着子進程無法超越父進程。
它說我應該「關閉或重新打開」這些孩子的文件句柄。關閉很簡單,但「重新打開」是什麼意思?我已經試過這樣的事情從我孩子的過程中,它不工作(輸出仍然得到亂碼):
open(SAVED_STDERR, '>&', \*STDERR) or die "Could not create copy of STDERR: $!";
close(STDERR);
# re-open STDERR
open(STDERR, '>&SAVED_STDERR') or die "Could not re-open STDERR: $!";
所以,我在做什麼錯呢?它所暗示的管道示例是什麼樣的?有沒有更好的方法來協調來自多個進程的輸出到控制檯?
我結束了與IO ::管道和AnyEvent管道和IO選擇,但似乎工作。謝謝 – mpeters 2010-10-07 17:33:53