我刚开始fork()
,我在理解并行执行方面遇到了一些困难。我找到了这个示例代码,我想知道它是第一次进入true
还是false
(我知道pid1==0
是否意味着它是一个孩子,等等)。我还想知道有多少副本(将创建子项)和一般执行的一些细节。
我试图运行它并添加return 0;
(我的原始来源没有它)只是为了查看是否退出...但是你可以看到它“等待”
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;
}
答案 0 :(得分:0)
首次使用true和false。
fork()
复制程序(创建1个子项),两个程序从该点继续执行。子进程将占用一个分支,而父进程将占用另一个分支。
fork()
的数量如下:
您从1个流程开始
pid1
之后 - > +1进程
家长分会</ strong>
pid4
之后 - &gt; +1进程
儿童科
pid2
之后 - &gt; +1进程
新创建的流程同时为fork()
运行pid3
,因此在pid3
- &gt;之后+2个过程
你得到5个孩子+原始过程。
答案 1 :(得分:0)
此程序创建五个后代进程,并对printf
进行六次调用,其中四个将是IF(TRUE)
消息,两个将是IF(FALSE)
。这是控制流程的ASCII艺术图;每次分支时,双方都会被执行,父母直接向下,孩子向右。这些数字是初始化fork
,pid1
,...变量的pid2
次调用,字母T和F是IF(TRUE)
和IF(FALSE)
消息,以及_
是函数末尾的return 0
。这个程序不等任何事情;所有控制流路径最终都会到达return 0
。
|
1
|\------\
2 4
|\--\ |\
3 3 | |
|\ |\ | |
T T T T F F
| | | | | |
_ _ _ _ _ _
输出消息可能出现在任何顺序中。在所有后代进程写入消息之前,最顶层的父进程可能会退出(将控制权返回给shell),因此(在screeenshot中可见)shell提示可能会混淆消息也是。
请注意,根据消息文本,您的if
条件向后:pid1 != 0
在父级中为真,而不是子级。