刷新IO缓冲区后,C程序仍会丢失一些输出
下面的C程序即使在刷新IO缓冲区后也会丢失一些输出刷新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
#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
运行此程序,它的输出与预期一样。使用>
也可以按预期工作@乔纳坦利弗勒