在等待子进程终止时,我从以下代码中看到异常的信号编号(例如 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()
的一部分。