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