我试图理解以下内容,其中只有子进程正在创建子进程。
int main(int argc, char **argv) {
int i;
int n;
int num_kids;
if (argc != 2) {
fprintf(stderr, "Usage: forkloop <numkids>\n");
exit(1);
}
num_kids = atoi(argv[1]);
for (i = 0; i < num_kids; i++) {
n = fork();
if (n > 0) {
printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
if (wait(NULL) == -1) {
perror("wait");
}
exit(0);
} else {
printf("pid = %d, ppid = %d, i = %d\n", getpid(), getppid(), i);
}
}
return 0;
}
我是否正确理解,在每个循环结束时,父进程退出,并且子进程成为新父进程?原因是exit()语句,它终止了父进程?另外,在父级中执行wait(),等待其子级终止,循环的每次迭代,然后才退出吗?但是,孩子从未真正退出,所以等待陈述何时发挥作用?
答案 0 :(得分:3)
我是否正确理解,在每个循环结束时,父母 进程退出,孩子成为新的父母?原因是 exit()语句,它终止父进程?
是的,但这个过程并不会立即死亡。每个父母&#34;调用wait()
并等待子进程完成。
此外,在父级中执行wait(),等待其子级终止, 循环的每次迭代然后才退出?
是。这意味着&#34;父母&#34;进程以相反的顺序死亡。这意味着第一个过程最后死亡。
但是,孩子从未真正退出,所以等待的时间 声明发挥作用?
所有进程都会在您的代码中消失。当第一个子进程继续执行for
循环时,父进程等待(类似地,所有其他子进程等待其子进程)。最后一个进程通过循环退出并通过main()
返回退出。