首页  >  文章  >  后端开发  >  为什么简单的 fork() 循环产生八个点而不是两个?

为什么简单的 fork() 循环产生八个点而不是两个?

Susan Sarandon
Susan Sarandon原创
2024-11-04 02:04:02434浏览

Why does the simple fork() loop produce eight dots instead of two?

fork() 中意外分支的奇怪案例

考虑以下使用 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>

令人惊讶的是,执行此程序会产生八个输出点,比您最初预期的多六个。为什么会出现这种情况?

揭开隐藏进程

为了解开这个谜团,让我们深入研究 fork() 的操作。 fork() 创建当前进程的副本,从而产生父进程和子进程。

最初,有一个进程,它分叉为两个进程。这两个过程都增量执行 for 循环,每次打印一个点。在第二次迭代中,每个进程再次分叉,总共创建四个进程。这四个进程在终止前打印一个点。

缓冲输出和延迟出现

但是,printf() 缓冲其输出,这意味着它会在发送之前累积多个打印内容立刻。当所有四个进程打印第二个点时,它们会被缓冲。这就是偷偷摸摸的效果出现的地方。

在 fork() 上,缓冲的点由子进程继承。因此,当每个子进程退出时,其缓冲点出现在输出流上。将这四个延迟点添加到增量打印的四个点中,总共会达到意想不到的八个点。

避免缓冲点

要绕过此缓冲行为,建议调用fflush(标准输出);在每个 printf() 语句之后。这会强制立即发送输出,确保显示预期的点数。

以上是为什么简单的 fork() 循环产生八个点而不是两个?的详细内容。更多信息请关注PHP中文网其他相关文章!

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