需要帮助理解fork C ++

时间:2014-04-24 17:46:59

标签: c++ fork

我正在尝试创建一个使用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()吗?

2 个答案:

答案 0 :(得分:2)

  1. 进程1调用fork进行第一次循环迭代,创建进程1.1。

  2. 然后进程1再次调用fork进行第二次循环迭代,创建进程1.2。

  3. 然后进程1.1(在fork完成时基本上是进程1重复)也进入第二次循环迭代,创建进程1.1.1。

  4. 因此,流程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语句。