小编典典

fork() 分支超出预期?

all

考虑以下代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
    int i;
    for(i = 0; i < 2; i++)
    {
        fork();
        printf(".");
    }
    return 0;
}

该程序输出 8 个点。这怎么可能?不应该有6个点吗?


阅读 109

收藏
2022-07-28

共1个答案

小编典典

原始人往往会fork()延伸想象力。在您对它有感觉之前,您应该在纸上追踪每个操作是什么,并说明进程的数量。不要忘记 fork()
创建了当前进程的近乎完美的副本。最显着的区别(对于大多数目的)是fork()父和子之间的返回值不同。(由于此代码忽略了返回值,因此没有区别。)

所以,起初,有一个过程。这将创建第二个过程,这两个过程都打印一个点和循环。在他们的第二次迭代中,每个人都会创建另一个副本,因此有四个进程打印一个点,然后退出。所以我们可以很容易地解释六个点,就像你期望的那样。

然而,printf()真正做的是缓冲它的输出。因此,只有两个进程时的第一个点在写入时不会出现。这些点保留在缓冲区中——这在 fork()
处被复制。直到进程即将退出缓冲点才出现。四个过程打印一个缓冲点,加上新的一个提供 8 个点。

如果您想避免这种行为,请致电fflush(stdout);after printf()

2022-07-28