fork() 理解,关于执行和 children
fork() understanding, about execution and children
我才刚刚开始 fork()
,我在理解并行执行方面遇到了一些困难。我找到了这个示例代码,我想知道它第一次是 true
还是 false
(我知道 pid1==0
是否意味着它是 child,等等).我也想知道有多少份(children会被创建)和一般执行的一些细节。
我已经尝试 运行 它并添加了 return 0;
(我的原始来源没有它)只是为了看看是否退出...但是正如你所看到的 "waits"
http://i.imgur.com/D3XEFgs.png
int main(void)
{
int pid1, pid2, pid3, pid4;
pid1=fork();
if (pid1!=0)
{
pid2=fork();
pid3=fork();
printf("\t\t IF(TRUE) pid1=%d and pid2=%d and pid3=%d\n",
pid1, pid2, pid3);
}
else
{
pid4=fork();
printf("\nIF(False) FATHER is talking with pid1=%d and pid4=%d\n",
pid1, pid4);
}
return 0;
}
第一次使用true和false。
fork()
复制程序(创建 1 child)并且两个程序从该点继续执行。 child 进程将采用一个分支,parent 进程将采用另一个分支。
fork()
个数如下:
您从 1 个进程开始
在 pid1
之后 -> +1 个进程
Parent 分支机构
在 pid4
之后 -> +1 个进程
Child 分支机构
在 pid2
之后 -> +1 个进程
两个新创建的进程 运行 fork()
pid3
,所以在 pid3
-> +2 个进程
之后
你得到5 children + 原始进程。
该程序创建了五个后代进程,并对 printf
进行了六次调用,其中四次是 IF(TRUE)
消息,两次是 IF(FALSE)
。这是控制流程的 ASCII-art 图;每次分支时,两边都被执行,parent 直接向下,child 向右。数字是初始化 pid1
、pid2
、...变量的 fork
调用,字母 T 和 F 是 IF(TRUE)
和 IF(FALSE)
消息,以及_
是函数末尾的 return 0
。这个程序不等待任何东西;所有控制流路径最终都到达 return 0
。
|
1
|\------\
2 4
|\--\ |\
3 3 | |
|\ |\ | |
T T T T F F
| | | | | |
_ _ _ _ _ _
输出消息可能以任何顺序出现。并且最顶层的 parent 进程可能会在所有后代进程写入消息之前退出(将控制权返回给 shell),因此(如您的屏幕截图所示)shell 提示也可能与消息混淆。
请注意,根据消息的文本,您的 if
条件向后:pid1 != 0
在 parent[=32= 中为真], 而不是 child.
我才刚刚开始 fork()
,我在理解并行执行方面遇到了一些困难。我找到了这个示例代码,我想知道它第一次是 true
还是 false
(我知道 pid1==0
是否意味着它是 child,等等).我也想知道有多少份(children会被创建)和一般执行的一些细节。
我已经尝试 运行 它并添加了 return 0;
(我的原始来源没有它)只是为了看看是否退出...但是正如你所看到的 "waits"
http://i.imgur.com/D3XEFgs.png
int main(void)
{
int pid1, pid2, pid3, pid4;
pid1=fork();
if (pid1!=0)
{
pid2=fork();
pid3=fork();
printf("\t\t IF(TRUE) pid1=%d and pid2=%d and pid3=%d\n",
pid1, pid2, pid3);
}
else
{
pid4=fork();
printf("\nIF(False) FATHER is talking with pid1=%d and pid4=%d\n",
pid1, pid4);
}
return 0;
}
第一次使用true和false。
fork()
复制程序(创建 1 child)并且两个程序从该点继续执行。 child 进程将采用一个分支,parent 进程将采用另一个分支。
fork()
个数如下:
您从 1 个进程开始
在 pid1
之后 -> +1 个进程
Parent 分支机构
在 pid4
之后 -> +1 个进程
Child 分支机构
在 pid2
之后 -> +1 个进程
两个新创建的进程 运行 fork()
pid3
,所以在 pid3
-> +2 个进程
你得到5 children + 原始进程。
该程序创建了五个后代进程,并对 printf
进行了六次调用,其中四次是 IF(TRUE)
消息,两次是 IF(FALSE)
。这是控制流程的 ASCII-art 图;每次分支时,两边都被执行,parent 直接向下,child 向右。数字是初始化 pid1
、pid2
、...变量的 fork
调用,字母 T 和 F 是 IF(TRUE)
和 IF(FALSE)
消息,以及_
是函数末尾的 return 0
。这个程序不等待任何东西;所有控制流路径最终都到达 return 0
。
|
1
|\------\
2 4
|\--\ |\
3 3 | |
|\ |\ | |
T T T T F F
| | | | | |
_ _ _ _ _ _
输出消息可能以任何顺序出现。并且最顶层的 parent 进程可能会在所有后代进程写入消息之前退出(将控制权返回给 shell),因此(如您的屏幕截图所示)shell 提示也可能与消息混淆。
请注意,根据消息的文本,您的 if
条件向后:pid1 != 0
在 parent[=32= 中为真], 而不是 child.