【发布时间】:2020-03-29 00:20:46
【问题描述】:
在“Unix 环境中的高级编程”一书中,wait and waitpid 部分说:
waitpid 函数不会等待首先终止的子进程;它有许多选项来控制它等待哪个进程。
我读这个好像子进程先退出,父进程没有调用waitpid函数,子进程不会被等待,退出后会保持僵尸进程。
所以我写了一些代码来测试:
int main() {
pid_t pid = fork();
if (pid == 0) {
// child process
printf("Child Process ID: %d \n", getpid());
printf("Child Process Quit\n");
exit(0);
} else {
// parent
sleep(5);
printf("Parent Process ID: %d \n", getpid());
printf("Wait child %d ...\n", pid);
int status;
waitpid(pid, &status, 0);
printf("waitpid called\n");
sleep(5);
}
return 0;
}
程序先打印出“子进程ID”和“子进程退出”,而父进程还在休眠,在另一个终端窗口,如果我使用ps -el | grep 'Z',我可以看到这个子进程是@ 987654325@(僵尸)。
然后5秒后,只要父进程调用waitpid,在另一个终端窗口中,使用ps -el | grep 'Z'就不会再显示僵尸子进程了,也就是说子进程已经等待了,没有不再是僵尸了。
看来父进程总是可以等待带有waitpid 的子进程,那么我该如何解释这个“waitpid 函数不等待首先终止的子进程”?
【问题讨论】:
标签: unix