通过处理程序收割僵尸进程

Reaping zombie processes via handler

下面写的代码是处理接收到的信号,由父进程收割僵尸"from System Programming course of CMU"。

Q1-1"the first arg of the waitpid function"的规则是什么?我们不应该传递我们正在收割的僵尸的 pid 吗?

Q2。对于此处的循环,它是否会在每次任何先例僵尸收到信号时检查所有僵尸?

int ccount = 0;
void child_handler2(int sig)
{
int child_status;
pid_t pid;
while ((pid = waitpid(-1, &child_status, WNOHANG)) > 0) {
   ccount--;
   safe_printf("Received signal %d from process %d\n",sig, pid);
 }
}

void fork14()
have sent this signal
{
pid_t pid[N];
int i, child_status;
linux> ./forks 14
ccount = N;
signal(SIGCHLD, child_handler);
for (i = 0; i < N; i++)
   if ((pid[i] = fork()) == 0) {
      sleep(1); /* deschedule child */
      exit(0); /* Child: Exit */
   }

while (ccount > 0)
pause(); /* Suspend until signal occurs */
}

Q1. “-1”表示检查所有child进程。

Q2。当 child 进程死亡时,内核会向其 parent 发送一条消息以获取它。并且由于无法排队的信号接收的性质 "at most one can be received at a time" 如果在处理程序完成处理前一个信号之前收到,可能会导致丢弃一些后来的信号,并且可能不会。所以,我们不能确定那时我们会有 N 个僵尸,因为其中一些可能已经由处理程序自动处理了。这就是为什么每次我们收割一个僵尸时,我们都会检查 是否有 另一个僵尸收割并收割它或(他们)。所以,检查这里是为了防止等待已经收割的 child 以防止 parent 冻结 "if we let it waits for a reaped zombie".