c – 为什么在写入stderr之前我需要在stdout上使用fflush?

我正在阅读’UNIX网络编程:套接字网络API’,在示例代码中,它们具有错误处理功能,其中包含以下行:
fflush(stdout);     /* in case stdout and stderr are the same */
fputs(buf,stderr);
fflush(stderr);

其中buf包含错误描述.我不明白为什么在第一行的stdout上使用fflush以及注释解释其使用原因的原因.

解决方法

这是因为缓冲. Stdout and stderr are usually buffered differently.标准输出通常是行缓冲的,这意味着它在看到换行符之前不会显示输出. Stderr通常是无缓冲的,会立即打印出来,你应该看到错误信息.

但是他们都去了同一个地方,终点站.这就是/ *,如果stdout和stderr是相同的* /.他们通常是.但由于它们的缓冲方式不同,这可能会导致它们无序显示.

考虑这段代码.注意缺少换行符.

#include <stdio.h>

int main() {
    fprintf(stdout,"This is to stdout. ");
    fprintf(stderr,"This is to stderr. ");
    fprintf(stdout,"This is also to stdout. ");
}

您希望输出为:

This is to stdout. This is to stderr. This is also to stdout.

但事实并非如此.它出了故障.

$./test
This is to stderr. This is to stdout. This is also to stdout.

立即显示输出到stderr,它是无缓冲的.虽然stdout必须等到stdout缓冲区被换行符刷新.没有换行符,因此在程序退出时会刷新.

通过在使用stderr之前刷新stdout,无论缓冲如何,都要确保输出的顺序正确.

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

int main() {
    fprintf(stdout,"This is to stdout. ");
    fflush(stdout);
    fprintf(stderr,"This is also to stdout. ");
}

$./test
This is to stdout. This is to stderr. This is also to stdout.

这可以确保错误消息与正常消息一起以正确的顺序出现.这避免了关于什么错误消息适用于程序的哪个部分的混淆.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...