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代码>之前。谢谢你睁开我的眼睛!