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

最佳答案

对于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.

关于linux - 在Linux中fwrite(),write(),pwrite(),fread(),read(),pread(),fsync()有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41373309/

10-11 04:28