【问题标题】:Writing and reading the same fd without fsync in Linux在 Linux 中不使用 fsync 写入和读取同一个 fd
【发布时间】:2011-12-17 18:43:03
【问题描述】:

假设我在不执行 fsync 的情况下将一个块写入文件描述符,然后稍后从同一个描述符读取同一个块。是否保证我会收到相同的信息?

程序是单线程的,任何时候其他进程都不会访问该文件。

【问题讨论】:

    标签: c linux fsync


    【解决方案1】:

    是的,由操作系统保证。

    即使修改尚未写入磁盘,操作系统也会使用其缓冲区缓存来反映文件修改并保证对所有进程的读取和写入的原子性级别。因此,不仅您的进程,而且任何其他进程都能够看到更改。

    对于fsync(),它只是指示操作系统尽最大努力将内容刷新到磁盘。另见fdatasync()

    另外,我建议你使用两个文件描述符:一个用于读取,另一个用于写入。

    【讨论】:

    • 谢谢。使用 2 个描述符有什么具体原因吗?
    • 因为它使工作更容易? ;)
    • 写入一个 fd 并读取另一个 fd 会怎样?如果我在一个 fd 中写一些东西而不刷新,没有关闭文件,然后我读入第二个文件描述符怎么办?我会在第二个文件描述符中获得我第一次写的内容而不进行刷新吗?
    【解决方案2】:

    fsync() 同步缓存和磁盘。由于数据已经在缓存中,因此将从那里而不是从磁盘中读取。

    【讨论】:

      【解决方案3】:

      当您写入文件描述符时,数据会先存储在内存缓存和缓冲区中,然后再发送到磁盘。所以只要不关闭描述符,就可以访问刚刚写入的数据。如果您关闭描述符,文件内容必须通过自己刷新或等待操作系统执行以提高效率,但如果您想确保在打开新 FD 后访问刚刚写入磁盘上的数据,您必须使用 fsync() 刷新到磁盘。

      【讨论】:

        猜你喜欢
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        相关资源
        最近更新 更多