0

在等待子进程终止时,我从以下代码中看到异常的信号编号(例如 50、80 或 117)。我只从一个特定的子进程中看到这一点,并且我无法访问进程源代码,而且它只会在某些时候发生。

我想知道这些不寻常的值是什么意思,给定NSIG == 32的,以及在哪里可以在标题或手册页中找到一些文档?

请注意,此代码在循环中运行,逐渐发送更多威胁信号,直到孩子终止。

int status, signal;

if (waitpid(m_procId, &status, WNOHANG) < 0) {
    LOGERR << "Failed to wait for process " << name() << ": " <<
        strerror(errno) << " (" << errno << ")";
    break;
} else if (WIFEXITED(status)) {
    m_exitCode = WEXITSTATUS(status);
    terminated = true;
    LOGINF << "Process " << name() << " terminated with exit code " << m_exitCode;
} else if (WIFSIGNALED(status)) {
    signal = WTERMSIG(status);    // !!! signal is sometimes 50, 80 or 117 !!!
    terminated = true;
    LOGINF << "Process " << name() << " terminated by signal " << signal;
} else {
    LOGWRN << "Process " << name() << " changed state but did not terminate.  status=0x" <<
        hex << status;
}

这是在 OSX 10.8.4 下运行的,但我也在 10.9 GM 种子中看到过它。

编辑如下修改代码使代码更加健壮,但是有时子进程会变得孤立,因为我猜循环不足以杀死子进程。

else if (WIFSIGNALED(status)) {
    signal = WTERMSIG(status);
    if (signal < NSIG) {
        terminated = true;
        LOGINF << "Process " << name() << " terminated by signal " << signal;
    } else {
        LOGWRN << "Process " << name() << " produced unusual signal " << signal
               << "; assuming it's not terminated";
    }
}

请注意,此代码是此类方法Process::unload()的一部分。

4

1 回答 1

2

waitpid 的 OS X 手册页中,指定 WNOHANG 时,您应该检查是否返回 0:

 When the WNOHANG option is specified and no processes wish to report status, wait4() returns a process
 id of 0.

 The waitpid() call is identical to wait4() with an rusage value of zero.  The older wait3() call is the
 same as wait4() with a pid value of -1.

发布的代码没有对此进行检查,这表明我的值status可能是垃圾(int 的值从未初始化)。这可能会导致您所看到的。

编辑:status确实只在waitpid返回 > 0 时设置。

于 2013-10-15T08:25:35.397 回答