我正在尝试创建一个使用fork创建4个进程的程序,我理解为2个父进程和2个子进程。
我设置代码的方式是:
for(int i = 0; i < 2; ++i){
pid_t pid1 = fork();
switch(pid1){
case -1:
fatal("fork failed");
break;
case 0:
child(i);
break;
default:
parent(i);
break;
}
}
分别在child()和parent()中,我调用了getpid()。在child()内部,一旦完成,我退出(0)。在parent()中我等待孩子使用wait(0)当我运行程序时,它输出2个不同的子pid和2个相同的父pid。这是因为我两次调用相同的fork()吗?
答案 0 :(得分:2)
进程1调用fork进行第一次循环迭代,创建进程1.1。
然后进程1再次调用fork进行第二次循环迭代,创建进程1.2。
然后进程1.1(在fork完成时基本上是进程1重复)也进入第二次循环迭代,创建进程1.1.1。
因此,流程1.1和1.2具有相同的父流程,流程1.总共有4个流程(1,1.1,1.2,1.1.1)。
请注意,步骤2和3可能会以不同的顺序发生,具体取决于操作系统决定如何安排流程。
答案 1 :(得分:0)
因为你在child(i)函数中使用了exit函数,所以child将退出,因此只有父进程才会继续执行for循环。所以你只得到2个新的进程分叉,它们是同一个父进程的子进程。所以父ID保持不变,但由于创建了两个孩子,所以得到2个不同的子pids!如果你想要分叉四个进程,那么你将不得不从child(i)函数中删除exit语句,并在每次fork()调用之后使用if else语句。