我正试图追踪这个程序。我看到它在运行时输出4次,但我不明白为什么。
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
if (fork() == 0)
fork();
else
{
fork();
fork();
printf("%d\n", getpid());
}
}
据我所知,if / else会问我的程序,然后如果我们在孩子身上,它再次分叉。如果我们在父级中,它会在else块中运行代码。不过,当我尝试追踪这一点后,我感到困惑。
在为我解释之后,我现在明白了。
第一个fork将生成一个孩子(我们称之为c1):
if (fork() == 0)
当你在孩子的时候,fork的返回值是0。所以,c1将执行if语句块:
fork();
在这里创建的子项c2(以及c1)都会死掉,因为它们不会执行else块。
同时,父进程将执行else块。
fork();
这将创建原始父进程的另一个子进程(c3)。 c3将执行else块中的下一个fork。
fork();
现在,我们也将拥有c4。
同时,原始父进程仍然会有一个没有运行的fork。这将创建最终的子进程c5。
在运行结束时,将有4个打印件:原始父进程,c3,c4和c5。
fork
的if
被执行。现在有两个进程子C1和父进程。父获得非零数字。孩子得到0
。fork
获得非零回报。现在再次有两个进程子C2和父进程 - 在else块中执行fork
之后。if
块之外它不会做任何事情。 (我们不关心这个)。所以4
,printf
执行 - 一个由父母,C2
,C3
和C4
。
关键的一线黄金法则是: -
父系统和子进程都在系统调用fork()之后立即开始执行
当控件到达function
的末尾时,每个过程结束,这里是main()
。 (回答你的上一个问题)。