了解fwrite()的缓冲行为

Sha*_*ala 8 c c++ linux fwrite

我正在使用函数调用fwrite()将数据写入Linux上的管道.

早些时候,fwrite()反复调用小块数据(平均20个字节)并留下缓冲fwrite().过程表明,一次写入4096字节的数据.

原来,这个写作过程是我程序的瓶颈.所以我决定将我的代码中的数据缓冲到64KB的块中,然后一次写入整个块fwrite().我曾经setvbuf()将FILE*指针设置为'No Buffering'.

性能提升并不像我预期的那么重要.

更重要的是,strace输出显示数据仍然一次写入4096个字节.有人可以向我解释一下这种行为吗?如果我fwrite()使用64KB数据调用,为什么一次只写4096个字节?

是否有fwrite()使用FILE*指针将数据写入管道的替代方法?

Dav*_*men 8

4096来自作为管道基础的Linux机器.它有两个地方.一个是管道的容量.容量是旧版Linux上的一个系统页面,在32位i386机器上是4096字节.(在更现代的Linux版本上,容量为64K.)

你将遇到4096字节问题的另一个地方是定义的常量PIPE_BUF,保证以原子方式处理的字节数.在Linux上,这是4096字节.此限制的含义取决于您是否将管道设置为阻塞或非阻塞.man -S7 pipe为所有血腥细节做一个.

如果您尝试以高速率交换大量数据,则可能需要重新考虑使用管道.你在Linux机器上,所以共享内存是一个选项.您可以使用管道发送相对少量的数据作为信令机制.