【问题标题】:what's the difference between fwrite(), write() , pwrite(),fread(), read() ,pread(), fsync() in Linux?Linux 中的 fwrite()、write()、pwrite()、fread()、read()、pread()、fsync() 有什么区别?
【发布时间】:2017-05-13 09:38:04
【问题描述】:

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

【问题讨论】:

  • 是的(大部分情况下)。 read/write 将数据从内核缓冲区传输到/从用户缓冲区传输到/从用户缓冲区传输。 fread/fwrite 在用户层多了一层缓冲。
  • @kaylum,pwrite 会调用 fsync() 内部吗?还有 fsync() 将数据从内核缓冲区写入磁盘,那么哪个系统调用从磁盘读取数据到内核缓冲区?
  • 单个帖子中的问题太多。在询问之前阅读这些功能的man 怎么样?对fsync() 的调用从未在man pwrite 中注明。 which system call read data from disk to kernel buffers? - 没有直接执行此操作的系统调用。不过,有fadvice 函数,它告诉内核文件打算如何使用,所以它可以准备缓冲区。
  • @Tsyvarev,我已经读过了,但是没有任何细节,比如与缓冲区有关。
  • @Tsyvarev,你能帮忙确认一下我的哪些陈述是错误的吗?

标签: linux io linux-kernel


【解决方案1】:

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

不,pwrite() 不会调用 fsync()。见pwrite(3): on file - Linux man page

The <i>pwrite</i>() function shall be equivalent to <i>write</i>(), 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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-25
    • 2010-10-09
    • 2012-02-11
    • 2012-07-09
    • 2016-06-19
    • 2023-03-07
    • 2016-12-21
    • 1970-01-01
    相关资源
    最近更新 更多