为什么我需要在写入 stderr 之前在 stdout 上使用 fflush?
Why would I need use fflush on stdout before writing to stderr?
我正在阅读 'UNIX Network Programming: The Sockets Networking API',在示例代码中,他们有一个错误处理函数,其中包含以下几行:
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(stderr);
其中buf包含错误描述。我不明白为什么第一行的stdout上使用fflush,为什么注释解释了它的使用原因。
如果 stdout 和 stderr 指向同一个文件,您必须确保先写入 stdout 缓冲区中的内容。
这是因为缓冲。 Stdout and stderr are usually buffered differently。 Stdout 是 通常 行缓冲,这意味着它不会显示输出,直到它看到换行符。 Stderr 通常 无缓冲,会立即打印,我的想法是您应该立即看到错误消息。
但他们都去同一个地方,航站楼。这就是 /* in case stdout and stderr are the same */
的意思。他们通常是。但是因为它们的缓冲方式不同,这可能会导致它们显示无序。
考虑这段代码。注意缺少换行符。
#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 to stderr. ");
fprintf(stdout, "This is also to stdout. ");
}
$ ./test
This is to stdout. This is to stderr. This is also to stdout.
这可确保错误消息与正常消息一起以正确的顺序出现。这避免了混淆哪些错误消息适用于程序的哪些部分。
我正在阅读 'UNIX Network Programming: The Sockets Networking API',在示例代码中,他们有一个错误处理函数,其中包含以下几行:
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(stderr);
其中buf包含错误描述。我不明白为什么第一行的stdout上使用fflush,为什么注释解释了它的使用原因。
如果 stdout 和 stderr 指向同一个文件,您必须确保先写入 stdout 缓冲区中的内容。
这是因为缓冲。 Stdout and stderr are usually buffered differently。 Stdout 是 通常 行缓冲,这意味着它不会显示输出,直到它看到换行符。 Stderr 通常 无缓冲,会立即打印,我的想法是您应该立即看到错误消息。
但他们都去同一个地方,航站楼。这就是 /* in case stdout and stderr are the same */
的意思。他们通常是。但是因为它们的缓冲方式不同,这可能会导致它们显示无序。
考虑这段代码。注意缺少换行符。
#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 to stderr. ");
fprintf(stdout, "This is also to stdout. ");
}
$ ./test
This is to stdout. This is to stderr. This is also to stdout.
这可确保错误消息与正常消息一起以正确的顺序出现。这避免了混淆哪些错误消息适用于程序的哪些部分。