【发布时间】:2017-02-22 05:18:39
【问题描述】:
所以我在 C 上编写了这段代码。我创建了一个父进程,它有两个子进程,一个成为僵尸进程。一秒钟后它退出,等待他的父亲结束了。另一个子进程仍然是孤立的,然后结束。我的问题是,如果我将wait 更改为waitpid 会发生什么。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main() {
pid_t pid;
int status, value;
pid = fork();
if (pid > 0) { // Father
pid = fork();
if (pid > 0) { // Father
wait(&status);
value = WEXITSTATUS(status);
if (value == 2)
printf("Child 2");
else if (value == 3)
printf("Child 1");
} else if (pid == 0) { //Child 2 - Orphan
sleep(4);
exit(2);
} else {
exit(1);
}
} else if (pid == 0) { // Child 1 - Zombie
sleep(1);
exit(3);
} else {
printf("Error al ejecutar el fork");
exit(1);
}
return 0;
}
【问题讨论】:
-
第一个孩子会变成僵尸,直到父亲退出,然后它会变成孤儿。
-
@Barmar 但怎么可能呢?第一个孩子(变成僵尸)也退出。
-
如果一个进程的父进程没有等待它就退出了,它就会成为一个孤儿。即使孩子已经退出也是如此。当它成为孤儿时,
init采用它,等待它,然后进程消失。 -
@Barmar 那么,两个子进程都变成孤儿了?
-
没有。你用
waitpid()等待的进程不会成为孤儿,因为你在等待它。