我正在和一位老师交谈,他告诉我读写系统调用正在使用缓冲区,因为你的系统规范中有一个变量控制你可以访问你想要读/写的设备的次数,当他等待在设备上写入时,系统使用缓冲区来存储数据。
我在另一篇 Stack Overflow 帖子(C fopen 与 open)上看到
fopen
和 fwrite
函数的优点之一是这些函数使用缓冲区(这应该更快)。
我已经阅读了 read
和 write
系统调用的手册页,并且手册页没有讨论任何缓冲区。
我是不是误会了什么?
read
/ write
C 系统调用缓冲区如何工作?
您提到的函数,
read
和write
是系统调用,因此它们的行为依赖于平台。
如您所知,
fread
和fwrite
是C标准库函数。它们在用户空间中进行缓冲,并以这种方式优化典型应用程序的性能。 read
和 write
是不同的。用户空间 C 库(例如 GNU libc)中有一些用于这些函数的存根代码,但该代码的主要功能只是提供一个方便的包装器来调用正确的内核功能(但也可以使用 调用该功能)直接syscall()
!)
如果您对详细信息感兴趣,这里是一个示例:uclibc库中
write
系统调用的包装器。
因此
read
和write
的典型实现不在用户空间中进行缓冲。不过,他们可能仍然在“内核空间”中进行缓冲。阅读有关 O_DIRECT
标志的更多详细信息:open(2) 中的 O_SYNC 和 O_DIRECT 标志有何不同/相似?