【发布时间】:2015-12-24 23:40:11
【问题描述】:
下面是 Fork 函数的示例。下面也是输出。我的主要问题与叉子有关,称为如何更改值。所以 pid1,2 和 3 从 0 开始,并随着分叉的发生而改变。这是因为每次分叉发生时,值都会被复制到子级并且父级中的特定值会发生变化?基本上值如何随 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() 创建一个新进程,该进程获取父数据的副本,就像在 fork() 之前一样。此外,对 fork() 的调用可以产生三个结果,而不仅仅是 2 或 1(正如代码所做的那样),三个结果是:0 表示父项。代码应始终检查所有三个结果。 IE。这:
pid2=fork(); /* B */ pid3=fork(); /* C */是不好的编码习惯,因为不知道哪个进程创建了“C”(实际上会有 2 个“C”进程)进程“E”也存在类似的考虑 -
子 'B' 和 'C' 永远不会到达 printf() 语句,因为之前的 'if' 语句。只有 'A'、'D' 和 'E' 会到达 printf() 语句。
-
youtube.com/watch?v=WcsZvdlLkPw 在此父进程的值被子进程 ID 覆盖,这是正确的吗?
标签: c linux process operating-system