【问题标题】:fork() in c using printf [duplicate]使用printf在c中fork()[重复]
【发布时间】: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 的那个只打印一次,而第一个打印两次呢?

【问题讨论】:

    标签: c fork printf


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!现在就明白了。
    【解决方案2】:

    变化:

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

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

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

    【讨论】:

    • 这真的没有回答“为什么”
    猜你喜欢
    • 2020-05-08
    • 2017-09-12
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多