C/ c++标准库中的缓冲

Buffering in standard library in C/C++

本文关键字:缓冲 标准 c++      更新时间:2023-10-16

我有一个关于I/O标准库缓冲的问题:我读了《Linux编程接口》第13章关于文件I/O缓冲,作者提到标准库使用磁盘文件和终端的I/O缓冲。我的问题是,这个I/O缓冲也适用于FIFO,管道,套接字和网络文件?

可以,如果您使用的是基于FILE *的标准I/O库。唯一可能发生的奇怪情况是,底层系统文件描述符返回isatty函数的非零值。然后工作室可以"行缓冲"输入和输出。这意味着当它看到'n'时,它倾向于冲洗。

我认为如果文件描述符1为isatty返回非零,则需要行缓冲stdout

No。任何普通的文件描述符(比如由open(2)pipe(2)socket(2)accept(2)返回的文件描述符)都不会被缓冲——读取或写入的任何数据都是通过直接系统调用立即输入或输出的。

缓冲只发生在你有FILE*对象的时候,你可以通过fopen(3)来获得一个普通的磁盘文件;对象stdinstdoutstderr也是在程序启动时设置的FILE*对象。缓冲通常在FILE*对象上启用,但并不总是启用——它可以在setbuf(3)中禁用,并且stderr默认情况下是不缓存的。

如果你想从一个普通的文件描述符中创建一个缓冲流,你可以使用fdopen(3)