读写 C 系统调用是否使用缓冲区?

Nof*_*fix 3 c io system-calls read-write

我正在与一位老师交谈,他告诉我读写系统调用正在使用缓冲区,因为系统规范中有一个变量控制您可以访问要读取/写入的设备的次数,并且当他等待在设备上写入时,系统使用缓冲区来存储数据。

我在另一篇 Stack Overflow 帖子(C fopen vs openfopen )上看到和函数的优点之一fwrite是这些函数使用缓冲区(这应该更快)。read我已经阅读了和sys call的手册页write,并且手册页没有讨论任何缓冲区。

我是不是误会了什么?read/ writeC 系统调用缓冲区如何工作?

kfx*_*kfx 6

您提到的函数readwrite系统调用,因此它们的行为依赖于平台。

如您所知,freadfwrite是 C 标准库函数。它们在用户空间中进行缓冲,并以这种方式优化典型应用程序的性能。read并且write是不同的。用户空间 C 库(例如 GNU libc)中有一些用于这些函数的存根代码,但该代码的主要功能只是提供一个方便的包装器来调用正确的内核功能(但也可以直接调用该功能syscall()) !)

如果您对详细信息感兴趣,这里write有一个示例: uclibc 库中系统调用的包装器。

read因此和的典型实现write不在用户空间中进行缓冲。不过,它们仍然可能在内核空间中进行缓冲。阅读有关该O_DIRECT标志的更多详细信息:Open(2) 中的 O_SYNC 和 O_DIRECT 标志有何不同/相似?