认为
int main(void)
{
printf("foo\n");
sleep(10);
printf("bar\n");
}
在控制台上执行时
$ ./a.out
您将看到foo
line 和 10 秒后的bar
line(--> line buffered)。将输出重定向到文件或管道时
$ ./a.out > /tmp/file
文件保持为空(--> 缓冲)直到程序终止(--> 退出时隐式 fflush())。
当上面的行不包含 a\n
时,在程序终止之前,您也不会在控制台上看到任何内容。
在内部,printf()
将一个字符添加到缓冲区。为了使事情更容易,让我来描述fputs(char const *s, FILE *f)
而不是。 FILE
可以定义为
struct FILE {
int fd; /* is 0 for stdin, 1 for stdout, 2 for stderr (usually) */
enum buffer_mode mode;
char buf[4096];
size_t count; /* number of chars in buf[] */
};
typedef struct FILE *FILE;
int fflush(FILE *f)
{
write(f->fd, f->buf, f->count);
f->count = 0;
}
int fputc(int c, FILE *f)
{
if (f->count >= ARRAY_SIZE(f->buf))
fflush(f);
f->buf[f->count++] = c;
}
int fputs(char const *s, FILE *f)
{
while (*s) {
char c = *s++;
fputc(c, f);
if (f->mode == LINE_BUFFERED && c == '\n')
fflush(f);
}
if (f->mode == UNBUFFERED)
fflush(f);
}