下面是一个Fork函数的实例。以下也是输出。我的主要问题是如何处理一个分叉被称为值如何改变。所以pid1,2和3从0开始,随着分叉的发生而变化。这是因为每次发生分叉时,值都被复制到子级,并且父级中的特定值被更改了?基本上,如何使用fork函数改变数值?C中的Fork()函数
#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)
理想情况下,我希望看到它解释为这种方式对我有意义。 *是我主要困惑的地方。当孩子分叉例如pid1 = fork();
创建一个过程与父母的所有价值,但它会传递一个值,如让我们说1给父母pid1?这意味着孩子会有pid 1 = 0,pid2 = 0和pid3 = 0,然后父母为pid1 = 2且pid2和3等于0?
叉子()创建一个新的过程,是可以获得父数据的副本,因为它是前叉()。另外,对fork()的调用可以有三个结果,而不仅仅是2或1(如代码所做的),结果如下:<0表示错误,= 0表示子项,> 0表示父项。代码应该总是检查所有三个结果。 I.E.这个:'pid2 = fork();/* B */ pid3 = fork();/* C * /'是错误的编码实践,因为不知道哪个进程创建'C'(实际上会有2个'C'进程)。对于进程'E'存在类似的考虑。 – user3629249
儿童'B'和'C'由于前面的'if'语句,从未到达printf()语句。只有'A','D'和'E'到达printf()语句。 – user3629249
youtube.com/watch?v=WcsZvdlLkPw在这个父进程有一个值被子进程ID覆盖的值是否正确? – Plisken