鉴于以下内容:
处理程序
void sig_child(int sig)
{
signal(SIGCHLD, sig_child);
if (sig == SIGCHLD)
{
int status;
pid_t num;
while ((num = waitpid(WAIT_ANY, &status, WNOHANG)) > 0)
{
}
if (num == -1 && errno != ECHILD)
{
// We shouldn't reach here
assert(0);
}
}
主要的模糊:
if (pidnum)
{ //Some work
int status;
pid_t num = waitpid(pidnum, &status, 0);
// Some work
}
我认为应该发生以下情况:
1)主代码(在第二个模糊中)调用waitpid
2)引发SIG_CHLD,因此控制转移到信号处理程序
3)信号处理程序从信号处理程序中删除已终止的子进程,获取其状态信息
4)当控制转回主代码(第二个模糊)时,由于进程的子进程已从进程表中删除,因此num应设置为-1
实际上,发生了以下情况(我使用了一些现在被删除以跟踪流程的打印语句),这与我上面的理解相矛盾:
1)主要的模糊到达waitpid
2)引发SIG_CHLD,因此控制转移到处理程序
3)num设置为-1,errno设置为ECHILD
4)控制返回到主模糊,其中num被赋予之前分叉的孩子的pid .