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

时间:2018-02-08 15:08:04

标签: c io system-calls read-write

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

我在其他Stack Overflow帖子(C fopen vs open)上看到$attachment.. -attachments $attachment 函数的一个优点是那些函数正在使用缓冲区(应该是这样的快点)。 我已经阅读了fopenfwrite sys调用的手册页,并且手册页没有讨论任何缓冲区。

我误解了什么吗? read / write C系统调用缓冲区如何工作?

1 个答案:

答案 0 :(得分:2)

您提及的功能readwrite是系统调用,因此它们的行为取决于平台。

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

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

因此readwrite的典型实现不会在用户空间中进行缓冲。但是,它们仍然可以在内核空间中进行缓冲。有关详细信息,请参阅O_DIRECT标记:How are the O_SYNC and O_DIRECT flags in open(2) different/alike?