需要帮助理解fork C++
Need help understanding fork C++
我正在尝试创建一个程序,该程序使用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为第一次循环迭代调用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可能以不同的顺序发生,这取决于OS决定如何调度进程。
因为您在child(i)函数中使用了exit函数,所以child将退出,因此只有父进程将在for循环中继续执行它。所以你只得到两个新的进程,它们是同一个父进程的子进程。所以父id保持不变,但由于创建了两个子id,所以获得两个不同的子id!如果您希望四个进程被分叉,那么您必须从child(i)函数中删除exit语句,并在每次分叉()调用后使用If-else语句。
相关文章:
- execlp() 在 fork() 之后无法正常工作
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 为什么if(fork()==0){getpid()}和popen()进程返回相同的进程id
- While循环在fork和execvp调用后没有继续
- fork(),在C中共享内存和指针
- fork/pipes和运行多个程序
- Gdb 未加载要在 fork 使用的源文件
- fork() 无法使用 Cygwin
- PID 不使用 fork() 定义类型
- 为什么我应该使用 fork() 来守护我的进程?
- 修改跨 fork() 的指针中的数据
- C++ fork() 和 execl() 调用 (Linux) 后无法识别命令
- 在 fork() 之后,如何在 for() 循环中继续运行 execve()
- 如何在最后一个子 fork() 下打印带有其名称和 pid 的子进程
- fork()和exec()两个子进程
- 我试图了解 fork() 函数序列是如何工作的?
- 如何使用gmock框架模拟c++单元测试中的fork和execlp系统调用
- 使用 fork 创建子进程时,父 ID 与父 ID 不同
- 使用pipe()和fork()从文件中读取并输出到console/new文件