需要帮助理解fork C++

Need help understanding fork C++

本文关键字:fork C++ 助理 帮助      更新时间:2023-10-16

我正在尝试创建一个程序,该程序使用fork创建4个进程,据我所知,这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)等待子进程。当我运行程序时,它会输出两个不同的子进程和两个相同的父进程。发生这种情况是因为我两次调用同一个fork()吗?

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

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

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

所以进程1.1和1.2有相同的父进程1。共有4个过程(1、1.1、1.2、1.1.1)

请注意,步骤2和3可能以不同的顺序发生,这取决于OS决定如何调度进程。

因为您在child(i)函数中使用了exit函数,所以child将退出,因此只有父进程将在for循环中继续执行它。所以你只得到两个新的进程,它们是同一个父进程的子进程。所以父id保持不变,但由于创建了两个子id,所以获得两个不同的子id!如果您希望四个进程被分叉,那么您必须从child(i)函数中删除exit语句,并在每次分叉()调用后使用If-else语句。