首页  >  文章  >  后端开发  >  为什么我的“fork()”循环产生的输出比预期多?

为什么我的“fork()”循环产生的输出比预期多?

DDD
DDD原创
2024-11-04 07:46:31199浏览

Why Does My `fork()` Loop Produce More Output than Expected?

为什么 fork() 分支比预期多?

考虑以下代码片段:

<code class="c">#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;
}</code>

执行时,该程序令人惊讶地输出8 个点,而不是预期的 6 个。这怎么可能?

fork() 的行为

要理解意外的输出,我们必须深入研究 fork() 原语的复杂性。当调用 fork() 时,它会创建当前进程的近乎完美的副本。最显着的区别(对于大多数用途)是父进程和子进程的不同返回值。但是,提供的代码忽略了这些返回值,实际上使这种区别变得无关紧要。

跟踪执行

最初,存在一个进程。随后,它创建第二个进程,导致两个进程打印一个点并继续循环。在第二次迭代中,每个进程再次创建一个副本,从而导致四个进程打印一个点然后退出。这解释了前六个点。

缓冲和延迟输出

但是,printf() 使用输出缓冲。因此,这两个过程打印的初始点并不是立即可见的。这些点保持缓冲状态,并在 fork() 期间复制。只有当进程退出时,缓冲的点才会被刷新并出现。因此,四个进程输出一个缓冲点以及一个新点,会产生 8 个点的意外输出。

防止意外输出

要抑制此行为,请使用 fflush(stdout);可以在每个 printf() 语句之后调用,从而确保点立即显示。

以上是为什么我的“fork()”循环产生的输出比预期多?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn