下面编写的代码是处理接收到的信号并通过父进程“从CMU的系统编程课程”中获取僵尸。
Q1 即可。 -1 “waitpid函数的第一个arg”的规则是什么?我们不应该通过我们正在收获的僵尸的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 */
}
答案 0 :(得分:0)
Q1。&#34; -1&#34;意味着检查所有子进程。
<强> Q2 即可。当子进程死亡时,内核会向其父进程发送一条消息以获取它。并且因为无法排队的信号接收的性质最多可以在一次接收到#34;如果在处理程序完成处理前一个信号之前收到,则可能导致丢弃一些后来的信号,并且可能不会。因此,我们无法确保当时我们将拥有N个僵尸,因为其中一些僵尸可能已被处理程序自动处理。这就是为什么每次我们收获一个僵尸,我们检查是否有另一个僵尸收获和收获它或(他们)。因此,检查这里是为了防止等待已经收获的孩子来保存父母免于冻结#34;如果我们让它等待收获的僵尸&#34;。