首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在perl中分叉,但从子进程中的系统调用获得退出状态。

在perl中分叉,但从子进程中的系统调用获得退出状态。
EN

Stack Overflow用户
提问于 2011-04-28 03:35:20
回答 2查看 1.8K关注 0票数 3

我所做的:

  1. 对cgi脚本进行ajax调用。
  2. Cgi脚本分叉,但父脚本立即返回响应msg。
  3. 执行系统调用,但需要退出代码和任何错误消息。

伪码:

代码语言:javascript
复制
$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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-28 07:05:59

因为您将$SIG{CHLD}设置为IGNORE,所以获得了a-1。通过这样做,您将扼杀qx捕获tar退出代码的能力.它将在不通知父进程(子进程)的情况下死亡。

它很简单,可以测试出来:

代码语言:javascript
复制
perl -e '$SIG{CHLD} = "IGNORE"; system("ps"); print "Finished with $?\n";

这是-1。

代码语言:javascript
复制
perl -e 'system("ps"); print "Finished with $?\n";

这就等于0。

如果您确实需要$SIG{CHLD} = 'IGNORE',那么只需在qx调用之前使用$SIG{CHLD} = 'DEFAULT'即可。

另外,确保您使用的是tar的完整路径(例如,/bin/tar),以防您的路径中没有/bin,而且它无法执行。但是,我认为这是可以的,因为您没有提到没有创建tar文件。

票数 6
EN

Stack Overflow用户

发布于 2011-04-28 05:54:16

如果您在子部分(即在$SIG{CHLD}之后)将undef重置为undef,那么它不会影响父进程,对吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5813312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档