【发布时间】:2011-04-22 01:08:37
【问题描述】:
我正在编写一个分叉多个子进程的程序,我希望所有这些子进程都能够向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: $!";
那么,我做错了什么?它暗示的管道示例会是什么样子?有没有更好的方法将多个进程的输出协调到控制台?
【问题讨论】: