我正在编写一个程序,它会fork多个子进程,并希望所有这些子进程都能够在不混乱输出的情况下写入
STDERR
和STDOUT
。我没有做任何花哨的事情,只是发出以换行符结尾的行(在我的理解中,这应该是Linux上的原子操作)。从perlfaq中可以看到:
主进程和后台进程(“子”进程)共享相同的STDIN、STDOUT和STDERR文件句柄。如果两者同时尝试访问它们,可能会发生奇怪的事情。您可能需要关闭或重新打开这些文件句柄以供子进程使用。您可以通过打开管道(参见open)来解决这个问题,但在某些系统上,这意味着子进程无法生存于父进程之外。
它说我应该为子进程“关闭或重新打开”这些文件句柄。关闭很简单,但是“重新打开”是什么意思?我尝试了类似于以下代码,但它并不起作用(输出仍然混乱):
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: $!";
那么,我在这方面做错了什么?它所提到的管道示例是什么样子的?有没有更好的方法来协调多个进程的输出到控制台?