我是unix shell编程的新手,我很难得到关于分叉及其树木的好解释。我现在所知道的是,fork类是从主(父)中复制进程(子进程)。
更具体地说,我无法从一段代码中获得流程树的样子。
例如,在这个代码骨干上:
pid1=fork();
if (pid1!=0)
{
pid2=fork();
pid3=fork();
}
else
{
pid4=fork();
}
在我看来,原始过程下有3个进程(pid1,pid2,pid3)和这三个进程中的一个(pid4),也许是pid2&#39。
我尝试使用一些编写得非常好的代码来运行它:
int pid1, pid2, pid4, pid4;
printf("I'm the original Process %d with parent %d \n", getpid(), getppid());
pid1=fork();
if(pid1!=0)
{
pid2=fork();
printf("I'm P2 %d with parent %d \n", getpid(), getppid());
sleep(1);
pid3=fork();
printf("I'm P3 %d with parent %d \n", getpid(), getppid());
sleep(1);
}
else
{
pid4=fork();
printf("I'm P4 %d with parent %d \n", getpid(), getppid());
sleep(1);
}
编辑:我在上面的代码中放了一些睡眠(1),感谢dbush,所以我可以看到ppid'
那么,树是如何用这些类型的代码形成的?
答案 0 :(得分:2)
你总共会得到5个孩子:
c2--------------
|
|
c1---------------------------
| p4
|
|
|
| c5--------
| |
| |
| c3-----------------
| | p3
| |
| | c4--------
| | |
| | |
p---------------------------------
p1 p2 p3
第一个分支发生在p1
点,它创建了子c1
。这个孩子进入代码的else
部分并在p4
点运行分叉,创建子c2
。
回到父级,它在创建子p2
的点c3
处分叉。 这两个进程的然后在点p3
分叉,创建子c4
和c5
。
您看到某些进程将其父级报告为1的原因是因为父级正在子级之前完成。尝试将sleep(1)
放在此块的底部,以便为父进程留出时间,让孩子们可以看到它们。