我正在尝试追踪这个程序。我看到它在运行时输出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块中运行代码。不过,当我尝试追踪这一点后,我感到困惑。
一旦else语句再次分叉,我们不是在另一个孩子吗?
这些孩子什么时候停止产生?
答案 0 :(得分:3)
在向我解释之后,我现在明白了。
第一个分叉会产生一个孩子(让我们称之为c1):
if (fork() == 0)
当您在孩子身边时,fork的返回值为0。因此,c1将执行if语句块:
fork();
这里创建的孩子,c2(以及c1)都将死亡,因为他们不会执行else块。
同时,父进程将执行else块。
fork();
这会创建原始父进程的另一个子进程(c3)。 c3将执行else块中的下一个fork。
fork();
现在,我们也有c4。
同时,原始父进程仍然会有一个没有运行的分支。这将创建最终的子进程c5。
在运行结束时,将有4个打印:原始父进程,c3,c4和c5。
答案 1 :(得分:1)
fork
中的 if
。现在有两个进程子C1和父进程。父获得非零数字。孩子得到0
。
父进入其他区块,因为它从fork
返回非零值。现在再次有两个进程子C2和父进程 - 在else块中执行fork
之后。
父母再次使用C3。
儿童C2再次使用C4拨打。
请注意,C1也是分叉但除了结束if
块之外它不会做任何事情。 (我们不关心这个。)
所以4
,printf
执行 - 一个由家长,C2
,C3
和C4
执行。
关键的一线黄金法则是: -
父系统和子系统进程在系统调用fork()后立即开始执行
当控件到达function
的末尾时,每个进程都会结束main()
。 (回答你的上一个问题)。