【发布时间】:2012-11-01 05:52:00
【问题描述】:
有一个通过 fork 产生多个子进程的父进程。我希望父进程和子进程的日志文件是分开的。问题是子进程 STDOUT 被重定向到父日志文件以及子日志文件。不确定我需要更改什么以避免子进程日志消息进入父日志文件。我也不明白在下面的 setEnvironment 函数中创建 OUT 和 ERR 文件句柄的目的。这是一个现有的代码,所以我保持原样。在父进程和子进程中,我将变量 $g_LOGFILE 设置为包含不同的文件名,以便创建单独的日志文件。我也在父进程和子进程中调用 setEnvironment 函数。我尝试在子进程中关闭 STDOUT、STDERR、STDIN 并调用 setenvironment,但它无法正常工作。
sub setEnvironment()
{
unless ( open(OUT, ">&STDOUT") )
{
print "Cannot redirect STDOUT";
return 2;
}
unless ( open(ERR, ">&STDERR") )
{
print "Cannot redirect STDERR";
return 2;
}
unless ( open(STDOUT, "|tee -ai $g_LOGPATH/$g_LOGFILE") )
{
print "Cannot open log file $g_LOGPATH/$g_LOGFILE");
return 2;
}
unless ( open(STDERR, ">&STDOUT") )
{
print "Cannot redirect STDERR");
return 2 ;
}
STDOUT->autoflush(1);
}
####################### Main Program ######################################
$g_LOGFILE="parent.log";
while ($file = readdir(DIR))
{
my $pid = fork;
if ( $pid ) {
setEnvironment();
#parent process code goes here
printf "%s\n", "parent";
next;
}
$g_LOGFILE="child.log";
setEnvironment();
#child code goes here
printf "%s\n", "child";
exit;
}
wait for @pids
【问题讨论】:
-
您正在打印来自父母和孩子的相同消息。难道你的意思是关闭在父级下运行的
if ($pid) { ... }块中的打印? -
刚刚在父子节点中有一些示例 printf 语句。现在编辑了帖子。问题子消息打印在子日志以及父母日志中。我不希望它打印在父母日志中
-
谁能帮我解决这个问题
-
为什么不让父进程和子进程打印到单独的文件?
标签: perl