Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
刷新IO缓冲区后,C程序仍会丢失一些输出_C_Linux_Gcc_Fork_Flush - Fatal编程技术网

刷新IO缓冲区后,C程序仍会丢失一些输出

刷新IO缓冲区后,C程序仍会丢失一些输出,c,linux,gcc,fork,flush,C,Linux,Gcc,Fork,Flush,下面的C程序即使在刷新IO缓冲区后也会丢失一些输出 #include <stdio.h> #include <unistd.h> void fork2() { printf("(L0 %d) ", getpid()); fflush(stdout); fork(); printf("(L1 %d) ", getpid()); fflush(stdout); fork(); printf("(Bye %d) ", g

下面的C程序即使在刷新IO缓冲区后也会丢失一些输出

#include <stdio.h>
#include <unistd.h>

void fork2() {
    printf("(L0 %d) ", getpid());
    fflush(stdout);
    fork();
    printf("(L1 %d) ", getpid());
    fflush(stdout);
    fork();
    printf("(Bye %d) ", getpid());
    fflush(stdout);
}

int main() {
    printf("parent: %d\n", getpid());
    fflush(stdout);
    fork2();
    fflush(stdout);
    return 0;
}
但是,我运行了多次。它的输出并不总是这样。有时,它会在末尾遗漏部分输出,如下面所示,其中包含少于7个元组

parent: 26874
(L0 26874) (L1 26874) (Bye 26874) (L1 26875) (Bye 26876) (Bye 26875) (Bye 26877)
parent: 26882
(L0 26882) (L1 26882) (Bye 26882) (L1 26883) (Bye 26884) (Bye 26883)
为什么程序在刷新IO缓冲区后仍会丢失一些输出

程序在退出前不会自动刷新IO缓冲区吗

[更新]

当我连续运行多次时,此sreenshot显示我的shell

但我的另一台机器的工作方式与下面的不同


一种可能性是,第二个fork在父级或子级中失败-您没有进行测试,因此您不会知道。如果在每个
printf()
的末尾使用换行符,您的行为是否会有所不同(没有遗漏的输出)-它是否只会在您尝试将所有输出放在一行时引起问题?如果在
fork2()
中的
printf()
语句中打印
getppid()
以及
getpid()
,您会得到什么启示吗?
main()
中的第二个
fflush()
应该是多余的。您的任何进程都不会在退出前等待其子进程死亡。可能是第一个程序退出,shell提示符删除了尚未死亡的孩子们的输出吗?如果将程序的输出通过管道传输到诸如
cat
(或
less
more
)之类的程序,是否会发生任何变化?您的示例输出没有在程序打印的数据之后显示shell提示符。我在每个
fork
之后添加了错误检查,然后再次运行。当缺少部分输出时,
fork
s没有失败。但是,如果我在每个
printf
的末尾使用换行符,则输出总是与预期的一样@Jonathanleffler如果将输出通过管道传输到程序(例如,
cat
),该怎么办?或者重定向到一个文件?使用
>
(append)有什么区别吗?如果您还没有收集到,就不清楚它为什么不能按预期工作,因此我正在抓紧救命稻草。如果我使用
/a.out | cat
运行此程序,它的输出与预期一样。使用
>
也可以按预期工作@Jonathanleffler一种可能性是,第二个fork在父代或子代中都失败了——你没有测试,所以你不会知道。如果在每个
printf()
的末尾使用换行符,您的行为是否会有所不同(没有遗漏的输出)-它是否只会在您尝试将所有输出放在一行时引起问题?如果在
fork2()
中的
printf()
语句中打印
getppid()
以及
getpid()
,您会得到什么启示吗?
main()
中的第二个
fflush()
应该是多余的。您的任何进程都不会在退出前等待其子进程死亡。可能是第一个程序退出,shell提示符删除了尚未死亡的孩子们的输出吗?如果将程序的输出通过管道传输到诸如
cat
(或
less
more
)之类的程序,是否会发生任何变化?您的示例输出没有在程序打印的数据之后显示shell提示符。我在每个
fork
之后添加了错误检查,然后再次运行。当缺少部分输出时,
fork
s没有失败。但是,如果我在每个
printf
的末尾使用换行符,则输出总是与预期的一样@Jonathanleffler如果将输出通过管道传输到程序(例如,
cat
),该怎么办?或者重定向到一个文件?使用
>
(append)有什么区别吗?如果您还没有收集到,就不清楚它为什么不能按预期工作,因此我正在抓紧救命稻草。如果我使用
/a.out | cat
运行此程序,它的输出与预期一样。使用
>
也可以按预期工作@乔纳坦利弗勒