gpt4 book ai didi

perl - 在子进程中重定向 STDOUT

转载 作者:行者123 更新时间:2023-12-04 15:13:42 25 4
gpt4 key购买 nike

有一个通过 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

最佳答案

好的,我测试了这段代码。这是我的 sample code .在我的代码中存在类似(不完全)的问题:所有消息都被双重写入 child 的日志文件。

所以我对你的问题的回答:

The Problem is child process STDOUT gets redirected into the parent log file as well as the child log file.



这是因为当您使用管道( open(STDOUT, "|tee ... )打开文件作为潜在结果时,您的进程 fork()创建子进程,然后 exec进入你运行的程序(tee)。 Forking(for tee) 需要主进程的 STDOUT 所以 tee将写入 parent 的日志文件。所以我认为你必须撤销使用主进程的 STDOUT 句柄。或者,第二种方法 - 删除 tee 的使用- 最简单的方法。

Also i dont understand in the below setEnvironment function the purpose of creating OUT and ERR file handle.



似乎这是某人对上述问题的担忧。您可以 grep -rE '
\bERR\b' .
在代码中搜索是否使用。可能有人想保存真正的 STDOUT 和 STDERR 以供进一步使用。

关于perl - 在子进程中重定向 STDOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13171663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com