【发布时间】:2018-08-10 13:29:20
【问题描述】:
我正在尝试跟踪这个程序。我看到它在运行时输出 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 语句再次分叉,我们不是在另一个孩子吗?
孩子什么时候停止生成?
【问题讨论】:
-
在
else块中,第一个fork()复制该进程,然后每个复制运行第二个fork()生成另外两个进程。最终有 4 个进程到达printf()语句。 -
else块只能被一个进程(第一个fork()的父进程)访问,然后有两个对fork()的调用。 -
哦,好吧!谢谢你们!我现在明白了。
-
如果您没有
if部分并且您的程序仅包含else部分中的代码,您仍然会看到 4 个打印。你能理解它是如何工作的吗? -
@Jake 考虑自己写答案。
标签: c fork system system-calls