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

读写C系统调用是否使用缓冲区?,c,io,system-calls,read-write,C,Io,System Calls,Read Write,我和一位老师谈过,他告诉我读写系统调用使用缓冲区,因为在您的系统规范中有一个变量,控制您可以访问要读/写的设备的次数,并且在他等待在设备上写入时,系统使用缓冲区存储数据 我在另一篇Stack Overflow post()上看到,fopen和fwrite函数的优点之一是,这些函数使用了缓冲区(应该更快)。 我已经阅读了read和writesys调用的手册页,手册页没有提到任何缓冲区 我误解了什么吗?read/writeC系统调用缓冲区如何工作 您提到的函数、read和write都是系统调用,因此

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

我在另一篇Stack Overflow post()上看到,
fopen
fwrite
函数的优点之一是,这些函数使用了缓冲区(应该更快)。 我已经阅读了
read
write
sys调用的手册页,手册页没有提到任何缓冲区


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

您提到的函数、
read
write
都是系统调用,因此它们的行为取决于平台

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

如果您对细节感兴趣,可以举一个例子:uclibc库中的
write
系统调用的包装器


因此,
read
write
的典型实现不会在用户空间中进行缓冲。不过,它们仍然可以在内核空间中进行缓冲。阅读有关“O_DIRECT”标志的更多详细信息:

这里可能有很多误解,很难说它们都起源于何处。首先,C是一种可移植语言。有多种操作系统的C编译器,它们在幕后的工作方式都不同。因此,您不能对(操作)系统的工作方式进行假设。也就是说,
read
write
不是C函数。它们是操作系统函数,没有C系统调用。有操作系统调用,还有C函数。谢谢!您知道在哪里可以读取系统读/写系统调用的确切行为吗?