ILD

stardard io buffer机制
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2019-10-28 站点:Inside Linux Development

标准输入输出库,有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

https://stackoverflow.com/questions/58592099/pipeline-command-a-out-cat-printfline-n-in-a-out-is-not-excuted-and-no




Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.