c - 我不明白 fork() 的这个例子

标签 c unix fork

我有这个代码示例,但我不明白为什么这段代码会创建 5 个进程加上原来的进程。 (共 6 个过程)

#include <unistd.h>

int main(void) {
    int i;
    for (i = 0; i < 3; i++) {
        if (fork() && (i == 1)) {
            break;
        }
    }
}

Process graph

最佳答案

fork() 将进程一分为二,并返回 0(如果此进程是子进程)或子进程的 PID(如果此进程是父进程)。所以,这一行:

if (fork() && (i == 1)) break;

说“如果这是父进程,并且这是第二次通过循环,则跳出循环”。这意味着循环是这样运行的:

  • i == 0 : 第一次通过循环,i为 0,我们创建两个进程,都在 i == 1 处进入循环. 现在共有两个进程

  • i == 1 : 这两个进程都会 fork ,但由于 if (fork() && (i == 1)) break;,其中两个不会继续迭代行(不继续的两个都是 fork 调用中的 parent )。 现在总共有四个进程,但其中只有两个继续循环。

  • i == 2 : 现在,继续循环的两个都 fork,导致 6 个进程。

  • i == 3 : 所有 6 个进程退出循环(因为 i < 3 == false ,没有更多的循环)

关于c - 我不明白 fork() 的这个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9253353/

相关文章:

c - 为什么我的工具会在这里抛出 MISRA 错误?

c - 编写读取 CFG 并删除左递归的解析器的建议

c - Linux 内核标识符中前导和尾随下划线的含义是什么?

c - C语言中有关循环的空运行查询

c++ - 使用 C++ fork() 并创建父级的 4 个子级

c - 访问通过 execlp 传递的数组时出现问题

java - 是否可以在 unix 中以不同用户(root 用户除外)的身份运行脚本而不提示输入密码?

C程序中的chdir系统调用

bash - 如何遍历目录中的所有文件,按创建日期排序,有些文件名的名称中有空格

c - 通过 pipe() 从子进程接收到正确结果后程序挂起