我有以下代码:
#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的父母,还有其他事情我没有意识到?我只是被困住了。
答案 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)
回到你的问题,这是一个经典的簿记练习。一个诀窍就是:计算机在记账方面做得更好。
为了简化一些事情,我将呈现它们,好像所有进程在循环迭代完成时深呼吸:这在实践中不会发生。
在此迭代中,每个人都会使用else
。
下一次迭代会继续有趣,其中所有这些迭代都会有i==2
。
答案 1 :(得分:0)
在main()
功能结束时,添加对getchar()
的通话。这将使所有进程无限期地运行。然后运行$ps -ef
以查看完整的进程列表。这将显示每个进程的PID及其父进程的PID。然后,您将能够轻松地派生层次结构。
答案 2 :(得分:0)
最后,不会留下任何进程,因为所有进程都会在分叉后退出。但是当它们运行时,每个进程都是它所分叉的进程的直接父进程。但是,由于未定义哪个进程在分叉后获得了多少CPU时间,在第一个分支(P1产生P2)之后,如果P1首先获得CPU时间,则它是随机的,因此P1产生P3,或者如果子P2先运行并产生P3。
如果你在程序结束时放置一个睡眠(1000)并让它运行几次,并使用pstree
来检查它们,你会发现每次都会得到一个不同的模式