【问题标题】:Content written before fork() present in output twice在 fork() 之前写入的内容出现在输出中两次
【发布时间】:2014-11-27 12:58:37
【问题描述】:

我写了以下C代码:

#include<stdio.h>

int main(){
    printf("A");
    if(fork() == 0){
        printf("B");
    }
    else{
        printf("C");
    }
}

我得到的输出是:

ACAB

我希望这段代码只打印一次 A。
谁能解释一下这个输出?

【问题讨论】:

  • 最好使用描述why如何 某事“未按预期运行”的主题行。我已经尝试适当地改进这一点。
  • 这很棘手。有些雇主喜欢这样问。 fork 将所有数据从父级复制到用户,包括 IO 缓冲区。这是它的副作用。

标签: c printf stdio fork


【解决方案1】:

“A”存储在缓冲区中,并在两个进程退出时刷新。

【讨论】:

  • 好的,所以在 fork() 调用之后,孩子还创建了父母缓冲区的副本,这就是我得到这个输出的原因。
【解决方案2】:

您的错误是在fork-ing 之前没有刷新缓冲区,因此两个进程都会写入它。

fork()之前添加这个:

fflush(0); // Flush all output-streams

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多