ajax - 在 perl 中 fork 但从子进程中的系统调用中获取退出状态

标签 ajax perl fork exit qx

我所做的:

  • 对 cgi 脚本进行 ajax 调用。
  • Cgi 脚本派生,但父级立即返回响应消息。
  • child 进行系统调用,但需要退出代码和任何错误消息。

  • 伪代码:
    $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;}
    

    我的问题:

    无法从 qx() 获取正确的返回代码 ($?) 和任何错误消息,因为 ($SIG{CHLD} = 'IGNORE') 将其设置为 -1。如果我删除 $SIG{CHLD} 语句,客户端网页不会收到来自父级的响应消息,直到子级被收割。

    最佳答案

    你得到 -1 因为你正在设置 $SIG{CHLD}IGNORE .这样做,你就是在杀死 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' ,然后只是 $SIG{CHLD} = 'DEFAULT'在您之前 qx称呼。

    另外,请确保您使用的是 tar 的完整路径。 (例如 /bin/tar )以防万一您没有 /bin在您的路径中,并且无法执行。但是,我假设这没问题,因为您没有说明未创建 tar 文件。

    关于ajax - 在 perl 中 fork 但从子进程中的系统调用中获取退出状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5813312/

    相关文章:

    javascript - 显示 "loading..."文本 - 文档中的所有 div 只有一个 jquery.ajaxSend()

    regex - 维护特殊模式出现 regex perl

    macos - 如何告诉 cpanm Image::Magick 有关 header 位置的信息?

    php - 基于 Ajax 的搜索 PHP

    javascript - 从表单检索数据(Codeigniter、AJAX)

    asp.net - Ajax 在 ASP.NET 3.5 中启用网格排序和分页

    json - 如何避免使用 Perl JSON 模块在数字周围加上引号?

    c - 如何杀死fork的 child ?

    c - 了解 C 中的 fork() 顺序

    c - fork 和现有线程?