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

时间:2016-12-29 04:50:11

标签: linux io linux-kernel

我认为fwrite()在用户模式下将数据从用户应用程序传递到缓冲区,但是write()将数据从用户模式的缓冲区传递到内核模式的缓冲区,并且fsync ()将数据从内核模式的缓冲区传递到磁盘.Right? read()将数据从内核模式的缓冲区传递到用户模式的缓冲区,fread()将数据从缓冲区以用户模式传递给用户Application,对吧?对于pwrite(),除了lseek之外,它还调用fsync()?

1 个答案:

答案 0 :(得分:0)

  

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

否,pwrite()不致电fsync()。参见pwrite(3): on file - Linux man page

The pwrite() function shall be equivalent to write(), except that it writes into a given position without changing the file pointer.

  

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

将数据从内核缓冲区写入磁盘,可以调用fsync(),但不一定要这样做,只要最终缓冲区被刷新就可以了除非系统崩溃或重置,否则早晚。
从磁盘读取数据到内核缓冲区,不需要专用的系统调用 1 。系统从read()调用中知道要读取哪些数据,并且必须在调用返回之前读取数据(除非它们已被缓冲)。
1 最接近这种系统调用的地方可能是(如Tsyvarev已经提到的)fadvise(2): Give advice about file access - Linux man page

Allows an application to to tell the kernel how it expects to use a file handle, so that the kernel can choose appropriate read-ahead and caching techniques for access to the corresponding file.