我正在编写一个程序,它分叉多个子进程,我希望所有这些子进程都能够写入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