【发布时间】:2021-04-26 22:19:25
【问题描述】:
我正在开发使用fork() 和wait() 调用的c 程序,首先我创建了五个子进程,然后我调用了wait() 五次。每当我执行程序时,它都会在第二个 for 循环中打印相同的子进程 ID,该循环从第一个 for 循环中显示。在调用 wait() 函数之前,子进程永远不会退出。为什么会这样?为什么cpid 总是打印之前显示的确切子进程ID?
代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main( )
{
int child_pids[5];
int i;
printf("PARENT ID: %d \n", getpid());
for(i=0;i<5;i++) {
if(fork()==0) {
printf("child(pid): %d of parent(pid): %d \n",getpid(),getppid());
exit(0);
}
}
for(i=0;i<5;i++) {
int cpid=wait(NULL);
printf("parent (pid): %d waited for child(pid): %d \n",getpid(),cpid);
}
return 0;
}
如果我的提问方式有任何错误,请在下方评论
【问题讨论】:
-
“为什么 cpid 总是打印之前显示的确切子进程 ID?”父进程等待它的子进程,即它创建的进程。您希望看到什么不同?
-
既然
wait(NULL)只有在创建五个子进程后才会被调用,为什么在wait()调用之前没有退出任何子进程? -
推荐阅读文档至
wait()。 -
wait不会在父级中返回,直到子级退出。为什么你认为在wait之前没有孩子退出?