首页 > 解决方案 > C 中的 fork——令人困惑的输出

问题描述

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
        fork();
        printf("Hello");
        fork();
        return 0;
}

这里的代码打印 Hello 而不使用 '\n' 输出: HelloHelloHelloHello

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void)
{
        fork();
        printf("Hello\n");
        fork();
        return 0;
}

这里的代码打印 Hello 和 \n 输出:

Hello
Hello

标签: cfork

解决方案


@Stolenmoments 的怀疑是正确的。

基本上,第一个printf语句stdin用一些数据填充缓冲区,第二个 fork 复制stdin缓冲区。当所有程序退出时,它们都会刷新它们的缓冲区。

要查看未打印的孙叉,我们可以像这样扩展您的程序:

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
        int childpid = fork();
        printf("%s %d, ", "Hello", childpid);
        childpid = fork();
        return 0;
}

并且我们得到输出Hello 11221, Hello 0, Hello 11221, Hello 0, 显然childpid第二个 fork 的 s 是不一样的,否则它们不会是 fork 进程。

但是只要我们添加一个fflush

#include<stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
        fork();
        printf("Hello");
        fflush(stdout);
        fork();
        return 0;
}

我们得到了预期的输出HelloHello


推荐阅读