フォークを介して複数の子プロセスを生成する親プロセスがあります。親プロセスと子プロセスによるログファイルを分離したい。問題は、子プロセス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