我试图了解fork()的工作方式。这是我整理的一段代码:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(){
while(1){
if( fork() == 0){
printf( "%s\n", "this is child process" );
exit(0);
}
sleep(1);
}
}
输出正是我所期望的(每秒一次“这是子进程”),所以我想所有子进程都会在需要它们时退出,但是只要我在程序运行时运行“ ps -a”运行时,我看到进程列表以每秒一的速度增长。我在做什么错了?
答案 0 :(得分:1)
在成为僵尸之前,该过程变为僵尸。当父进程调用wait
时会发生这种情况。
由于子进程立即退出,因此您也可以调用wait
而不会阻塞太多:
while(1){
if( fork() == 0){
printf( "%s\n", "this is child process" );
exit(0);
}
wait(NULL);
sleep(1);
}
这些僵尸的存在是为了保留可以在父进程上传递的信息,例如子进程退出代码。
如果父进程退出时没有收获其子代,那么孤立的子代将成为init
进程的子代,它将在这些子代上收获(call
等待`)。