我所做的:
。
伪码:
$SIG{CHLD} = ‘IGNORE’; # or waitpid($pid,0) in the parent process
$pid = fork();
if($pid == 0)
{
close STDOUT; # So that the parent sends the response to the client right away.
@errorMsgs = qx(tar up big directories over 50G…); # This can go on for a few minutes.
if($? ==0) { Send a ‘success’ email } # Is always false ($? == -1)
else { Send a ‘failure’ email }
}
elsif($pid){ sendResponse; waitpid($pid,0) if $SIG{CHLD} != 'IGNORE'; exit;}我的问题是:
无法获得正确的返回代码($?)以及由于($SIG{CHLD} =“忽略”)而从qx()设置为-1的任何错误消息。如果我删除$SIG{CHLD}语句,则客户端网页直到子节点被收获后才会收到来自父节点的响应msg。
发布于 2011-04-28 07:05:59
因为您将$SIG{CHLD}设置为IGNORE,所以获得了a-1。通过这样做,您将扼杀qx捕获tar退出代码的能力.它将在不通知父进程(子进程)的情况下死亡。
它很简单,可以测试出来:
perl -e '$SIG{CHLD} = "IGNORE"; system("ps"); print "Finished with $?\n";这是-1。
perl -e 'system("ps"); print "Finished with $?\n";这就等于0。
如果您确实需要$SIG{CHLD} = 'IGNORE',那么只需在qx调用之前使用$SIG{CHLD} = 'DEFAULT'即可。
另外,确保您使用的是tar的完整路径(例如,/bin/tar),以防您的路径中没有/bin,而且它无法执行。但是,我认为这是可以的,因为您没有提到没有创建tar文件。
发布于 2011-04-28 05:54:16
如果您在子部分(即在$SIG{CHLD}之后)将undef重置为undef,那么它不会影响父进程,对吗?
https://stackoverflow.com/questions/5813312
复制相似问题