通过处理程序收割僵尸进程
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".
下面写的代码是处理接收到的信号,由父进程收割僵尸"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".