【问题标题】:Buffering in standard library in C/C++C/C++ 标准库中的缓冲
【发布时间】:2011-10-30 02:55:46
【问题描述】:

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

【问题讨论】:

    标签: c++ c linux unix


    【解决方案1】:

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

    我相信如果文件描述符 1 为 isatty 返回非零值,则需要对 stdout 进行行缓冲。

    【讨论】:

      【解决方案2】:

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

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

      如果您想从常规文件描述符中创建缓冲流,可以使用fdopen(3)

      【讨论】:

      • 嗨,Adam,感谢您的回答,但我知道我们可以通过调用 fdopen() 来使用现有 fd 创建一个 FILE 对象。如果我们通过调用这个函数并调用 fwrite() 或 fread() 创建一个 FILE 对象,标准 I/O 缓冲是否会应用于管道、套接字和 FIFO?
      • 我不确定 OP 到底在想什么,但总是有 some 级别的缓冲,否则不可能为管道、套接字编写同步接口等,同时保证不会丢失任何数据。
      猜你喜欢
      • 2012-07-05
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 2016-04-21
      • 2012-06-09
      • 2011-01-23
      相关资源
      最近更新 更多