在C / C ++中缓冲标准库

时间:2011-10-30 02:55:47

标签: c++ c linux unix

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

只有当您拥有FILE*个对象时才会发生缓冲,您可以通过fopen(3)来获取常规磁盘文件;对象stdinstdoutstderr也是在程序启动时设置的FILE*个对象。缓冲通常在FILE*个对象上启用,但并非总是如此 - 可以使用setbuf(3)禁用,默认情况下stderr无缓冲。

如果要从常规文件描述符中创建缓冲流,可以使用fdopen(3)执行此操作。