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