Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Process 理解fork()创建的流程_Process_Operating System_Fork - Fatal编程技术网

Process 理解fork()创建的流程

Process 理解fork()创建的流程,process,operating-system,fork,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(); } } #包括 #包括 main() { int i; 对于(i=0;i在mai

我有以下代码:

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

main()
{
    int i;

    for(i=0;i<3;i++)
        if(i%2==0) 
            fork();
        else{
            fork();
            fork();
        }
} 
#包括
#包括
main()
{
int i;

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

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


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

我支持Jonathon Reinhart的建议,但与
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)
回到你的问题上来,这是一个经典的簿记练习。其中一个诀窍就是:计算机更擅长簿记

为了简化这些事情,我将在循环迭代完成时,将所有过程都当作深呼吸来呈现:这在实践中是不会发生的

  • 起初有一个过程,它们的祖先都称为
  • for开始,因为i==0,所以您分叉,现在您有了另一个进程,B1-A的儿子
  • for结束,两个进程继续,并且在两个进程中i==1

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

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

有趣的是,在下一次迭代中,所有的进程都会有
i==2

进程的确切顺序可能会改变,是的,但层次结构是相同的。这可能不是CPU时间的多少的因素,而是它们被安排的顺序。在使用Linux的10年中,我从来没有听说过
pstree之前。谢谢你睁开我的眼睛!