理解fork()创建的进程

时间:2014-01-31 00:18:20

标签: process operating-system fork

我有以下代码:

#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的父母,还有其他事情我没有意识到?我只是被困住了。

3 个答案:

答案 0 :(得分:2)

我的第二次乔纳森莱因哈特的消化,但ps可能会更好地为pstree -p提供服务。快速尝试显示:

─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开始,因为我= = 0你叉,现在你有另一个过程,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

答案 1 :(得分:0)

main()功能结束时,添加对getchar()的通话。这将使所有进程无限期地运行。然后运行$ps -ef以查看完整的进程列表。这将显示每个进程的PID及其进程的PID。然后,您将能够轻松地派生层次结构。

答案 2 :(得分:0)

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

如果你在程序结束时放置一个睡眠(1000)并让它运行几次,并使用pstree来检查它们,你会发现每次都会得到一个不同的模式