使用printf在c中fork()[重复]

Posted

技术标签:

【中文标题】使用printf在c中fork()[重复]【英文标题】:fork() in c using printf [duplicate] 【发布时间】:2013-07-01 12:48:39 【问题描述】:

有 2 个不同的程序,例如它们很小:

int main()

        printf ("print hello");
        fork();


int main()

        printf ("print hello\n");
        fork();

输出 1 是:`print helloprint hello

输出2是:print hello

问题是,为什么带有\n 的那个只打印一次,而第一个打印两次呢?

【问题讨论】:

【参考方案1】:

您遇到了系统printf 实现的缓冲行为。在第一种情况下,字符串被打印到缓冲区中,但由于没有换行符(而且您没有调用fflush),它只是坐在那个缓冲区中。然后你分叉,当各自的进程退出时,两个分叉的缓冲区都会被刷新。

在第二种情况下,\n 导致缓冲区在分叉之前被刷新,因此当分叉进程退出时没有剩余输出。

【讨论】:

谢谢!现在就明白了。【参考方案2】:

变化:

    printf ("print hello");
    fork();

    printf ("print hello");
    fflush(stdout);
    fork();

默认情况下,stdout 通常是行缓冲的。在您的示例 2) 中,您可以保证 stdoutfork 之前刷新,但在示例 1) 中,它可能发生在 fork 之后。在fork 之前刷新stdout 保证您在fork 之前打印字符串。

【讨论】:

这真的没有回答“为什么”

以上是关于使用printf在c中fork()[重复]的主要内容,如果未能解决你的问题,请参考以下文章

linux gcc中fork()的工作[重复]

如何使用 printf 在 C 中打印无穷大符号 [重复]

使用fork()获取孩子的孩子

Linux中printf(“ n ...”)和printf(“.. n”)之间的输出差异[重复]

使用 printf 时的警告 [重复]

在 fork 后使用读/写管道 2 字符串