什么';Linux中fwrite()、write()、pwrite()、fread()、read()、pread()和fsync()之间的区别是什么?

什么';Linux中fwrite()、write()、pwrite()、fread()、read()、pread()和fsync()之间的区别是什么?,linux,io,linux-kernel,Linux,Io,Linux Kernel,我假设fwrite()在用户模式下将数据从用户应用程序传递到缓冲区,而write()在用户模式下将数据从缓冲区传递到内核模式下的缓冲区,而fsync()在内核模式下将数据从缓冲区传递到磁盘。对吗?read()在内核模式下将数据从缓冲区传递到用户模式下的缓冲区,fread()在用户模式下将数据从缓冲区传递到用户应用程序,对吗?对于pwrite(),除了lseek之外,它还调用fsync() 对于pwrite(),除了lseek之外,它还调用fsync() 否,pwrite()不调用fsync()。

我假设fwrite()在用户模式下将数据从用户应用程序传递到缓冲区,而write()在用户模式下将数据从缓冲区传递到内核模式下的缓冲区,而fsync()在内核模式下将数据从缓冲区传递到磁盘。对吗?read()在内核模式下将数据从缓冲区传递到用户模式下的缓冲区,fread()在用户模式下将数据从缓冲区传递到用户应用程序,对吗?对于pwrite(),除了lseek之外,它还调用fsync()

对于pwrite(),除了lseek之外,它还调用fsync()

否,
pwrite()
不调用
fsync()
。见:

pwrite()函数应等同于write(),只是它写入到给定位置而不改变文件指针。

另外,fsync()将数据从内核缓冲区写入磁盘,那么哪个系统调用将数据从磁盘读取到内核缓冲区呢

要将数据从内核缓冲区写入磁盘,可以调用
fsync()
,但如果缓冲区最终被刷新就足够了,则不必调用它,除非系统崩溃或重置,否则这种情况迟早会发生。
要将数据从磁盘读取到内核缓冲区,不需要专门的系统调用1。系统通过
read()
调用知道要读取哪些数据,并且在调用返回之前必须读取数据(除非它们已经被缓冲)。
1最接近此类系统调用的可能是(正如Tsyvarev已经提到的):


允许应用程序告诉内核它希望如何使用文件句柄,以便内核可以选择适当的预读和缓存技术来访问相应的文件。

是(主要是)<代码>读/写将数据从内核缓冲区传输到用户缓冲区或从用户缓冲区传输到内核缓冲区
fread/fwrite
在用户级别有一个额外的缓冲层。@kaylum,pwrite会调用fsync()内部函数吗?同样,fsync()将数据从内核缓冲区写入磁盘,那么哪个系统调用将数据从磁盘读取到内核缓冲区呢。在询问之前阅读这些函数的
man
怎么样?调用
fsync()
从未在中记录<代码>哪个系统调用将数据从磁盘读取到内核缓冲区?-没有直接执行此操作的系统调用。不过,有一个函数告诉内核如何使用文件,所以它可以准备缓冲区。@Tsyvarev,我已经读过了,但是没有任何细节,例如与缓冲区相关的内容。@Tsyvarev,你能帮我确认我的哪些语句是错误的吗?