【问题标题】:Understanding the processes created by fork()理解 fork() 创建的进程
【发布时间】:2014-01-31 00:18:19
【问题描述】:

我有以下代码:

#include <unistd.h>
#include <stdio.h> 

main()
{
    int i;

    for(i=0;i<3;i++)
        if(i%2==0) 
            fork();
        else{
            fork();
            fork();
        }
} 

我知道它最终有 16 个进程(或者至少我认为它有),但我不明白的是哪些进程是父进程,哪些是子进程。 所以我们就说 P1 是进程 1,P2 是进程 2,等等。 P1 是 P2、P3、P5 和 P9 的父级(我在树上画了这个,但我不确定我的树有多准确),而 P2 是 P4 的父级,等等?还是 P1 成为 P2、P3、P4 的父级,并且发生了我没有意识到的其他事情?我只是有点卡住了。

【问题讨论】:

    标签: process operating-system fork


    【解决方案1】:

    我赞同 Jonathon Reinhart 的建议,但 pstree -p 可能会更好地为您服务,而不是 ps。快速尝试显示:

    ─try(A)─┬─try(B1)─┬─try(C2)─┬─try(D1)───try(13874)
            │         │         └─try(13871)
            │         ├─try(C3)───try(13868)
            │         └─try(13867)
            ├─try(B2)─┬─try(C1)───try(13875)
            │         └─try(13872)
            ├─try(B3)───try(13873)
            └─try(13866)
    

    回到你的问题,这是一个经典的簿记练习。唯一的诀窍就是:计算机更擅长记账。

    为了简化事情,我将把它们呈现为好像所有过程在循环迭代完成时都会深呼吸:这在实践中不会发生。

    • 一开始只有一个进程,它们的祖先都叫A
    • for 开始,因为 i == 0 你 fork,现在你有另一个进程 B1 - A 的儿子
    • for 结束,两个过程继续,并且 i == 1。

    在这个迭代中,每个人都使用else

    • A 到达第一个分叉,突然你有了 B2 - A 的儿子,B1 的兄弟
    • B2 分叉,你有 C1 - B2 的儿子
    • A 到达第二个分叉,你有 B3,A 的儿子,B1 和 B2 的兄弟
    • B1 也到达了两个分叉中的第一个,所以你得到 C2 - B1 的儿子
    • B1 再次分叉,得到 C3
    • C2 有机会跑,所以你得到 D1

    有趣的是在下一次迭代中继续,他们都将拥有i==2

    【讨论】:

    • 在使用 Linux 的 10 年中,我之前从未听说过pstree。谢谢你让我大开眼界!
    【解决方案2】:

    main() 函数的末尾,添加对getchar() 的调用。这将使所有进程无限期地运行。然后运行$ps -ef 以查看完整的进程列表。这将显示每个进程的 PID 及其 进程的 PID。然后,您将能够轻松地推导出层次结构。

    【讨论】:

      【解决方案3】:

      最后,不会留下任何进程,因为它们除了在分叉后退出之外什么都不做。但是在它们运行时,每个进程都是它派生的进程的直接父进程。但是,由于未定义哪个进程在分叉后获得多少 CPU 时间,在第一次分叉(P1 产生 P2)之后,如果 P1 先获得 CPU 时间,因此 P1 产生 P3,或者如果子 P2 先运行并产生 P3,则是随机的。

      如果你在你的程序末尾加上一个 sleep(1000) 并让它运行几次,然后使用pstree 来检查它们,你会发现每次都会得到不同的模式。

      【讨论】:

      • 进程的确切顺序可能会改变,但层次结构将是相同的。而且它可能不是多少 CPU 时间的一个因素,而是它们被安排的顺序。
      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 2014-02-11
      • 2021-07-09
      • 1970-01-01
      • 2023-03-25
      • 2014-07-20
      • 2021-01-18
      • 2014-02-14
      相关资源
      最近更新 更多