#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
pid_t pid1, pid2, pid3;
pid1=0, pid2=0, pid3=0;
pid1= fork(); /* A */
if(pid1==0){
pid2=fork(); /* B */
pid3=fork(); /* C */
} else {
pid3=fork(); /* D */
if(pid3==0) {
pid2=fork(); /* E */
}
if((pid1 == 0)&&(pid2 == 0))
printf("Level 1\n");
if(pid1 !=0)
printf("Level 2\n");
if(pid2 !=0)
printf("Level 3\n");
if(pid3 !=0)
printf("Level 4\n");
return 0;
}
}
那么这就是执行过程。
----A----D--------- (pid1!=0, pid2==0(as initialized), pid3!=0, print "Level 2" and "Level 4")
| |
| +----E---- (pid1!=0, pid2!=0, pid3==0, print "Level 2" and "Level 3")
| |
| +---- (pid1!=0, pid2==0, pid3==0, print "Level 2")
|
+----B----C---- (pid1==0, pid2!=0, pid3!=0, print nothing)
| |
| +---- (pid1==0, pid2==0, pid3==0, print nothing)
|
+----C---- (pid1==0, pid2==0, pid3!=0, print nothing)
|
+---- (pid1==0, pid2==0, pid3==0, print nothing)
理想情况下,以下是我希望看到的解释方式,因为这种方式对我有意义。* 是我的主要困惑所在。例如,当子进程fork时pid1 = fork();
,它会创建一个具有父进程所有值的进程,但它是否会将一个值传递给父进程的pid1,比如说1? 这意味着子进程的pid1=0,pid2=0和pid3=0,父进程的pid1=2,pid2和pid3等于0吗?
pid2=fork(); /* B */ pid3=fork(); /* C */
是不良的编码实践,因为不知道哪个进程创建了'C'(实际上将有两个'C'进程)。对于进程'E'也存在类似的考虑。 - user3629249