标准输入输出库,有3种类型的buffer
unbuffered,立即输出。
block buffered,缓存满输出。
line buffered,按行输出。
通常,所有的文件都是block buffered。如果一个stream指向一个terminal,它是line buffered。标准错误默认总是unbuffered。
下面这些接口,可以用来设置缓存模式,和缓存大小。
1 2 3 4 5 6 7 | void setbuf ( FILE *stream, char *buf); void setbuffer( FILE *stream, char *buf, size_t size); void setlinebuf( FILE *stream); int setvbuf ( FILE *stream, char *buf, int mode, size_t size); |
模式有
_IONBF unbuffered
_IOLBF line buffered
_IOFBF fully buffered
对于setvbuf,如果buf为NULL,则只设置模式。
在程序中,使用printf输出内容时,如果所在terminal运行,这是line buffered的,如果是输出行,我们在terminal能立即看到。但是如果程序被重定向到文件,或者pipeline方式运行,那么是block buffered,printf的输出不会立即写入。这是需要注意的地方,此时可以手动将stdout设置为line buffered。
参考
https://linux.die.net/man/3/setlinebuf