【问题标题】:two file descriptors to same file两个文件描述符指向同一个文件
【发布时间】:2011-03-12 17:13:56
【问题描述】:

使用 posix read() write() linux 调用,是否可以保证如果我通过一个文件描述符写入并通过另一个文件描述符读取,以串行方式使得这两个操作相互排斥.. . 我的读取文件描述符总是会看到写入文件描述符最后写入的内容?

我相信是这样,但我想确保手册页对此没有太大帮助

【问题讨论】:

    标签: linux file posix file-descriptor


    【解决方案1】:

    这取决于你从哪里得到这两个文件描述符。如果它们来自 dup(2) 调用,那么它们共享文件偏移量和状态,因此在一个上执行 write(2) 会影响另一个上的位置。另一方面,如果它们来自两个单独的 open(2) 调用,则每个调用都有自己的文件偏移量和状态。

    文件描述符主要只是对内核文件结构的引用,并且它是包含大部分状态的内核结构。当您打开(2) 一个文件时,您将获得一个新的内核文件结构和一个引用它的新文件描述符。当您 dup(2) 一个文件描述符(或通过 sendmsg 传递一个文件描述符)时,您将获得对同一内核文件结构的新引用。

    【讨论】:

    • 如果我对每个单独使用单独的 open() 调用会怎样.. 来自写入 fd 的数据是否可用于读取 fd?
    • 通过两个单独的打开调用,每个 fd 将有自己的位置。因此,如果两者都在文件的开头,而您使用其中一个写入,则另一个仍将位于文件的开头,因此那里的写入将覆盖第一次写入的内容,除非您使用 O_APPEND 打开文件(在在这种情况下,每次写入都会在写入之前隐式搜索到末尾)。
    • 谢谢克里斯。我的问题有点不同,但是是的……如果第二个正在阅读,它将完全按照第一个所写的内容进行阅读。我的问题的答案是,是的,它保证在写入返回后从文件中读取的任何人都会读取写入所写的任何内容。这是因为linux锁定了对内存中io缓存页面的访问
    • 那么我们可以让两个文件描述符指向同一个文件但具有不同的值吗?
    • @MichaelXu 你有什么参考资料说“如果两个 fd 都指向同一个文件,在 fd 上读取总是会得到不同 fd 写入的内容(这两个 fd 是由分开的 open(2 ))”?我不认为克里斯·多德会这么说。
    【解决方案2】:

    如果它们都引用相同的文件描述,即您从“dup”或“dup2”(或通过fork() 继承)获得它们,则可以保证这一点。

    从其中一个成功返回后 这些系统调用,旧的和新的 可以使用文件描述符 可互换。他们指的是 相同的打开文件描述(见 open(2)) 并因此共享文件偏移量 和文件状态标志;例如,如果 通过使用修改文件偏移量 lseek(2) 在其中一个描述符上, 偏移量也改变了 其他。

    【讨论】:

      【解决方案3】:

      当您使用 dup()dup2()fork() 时, 文件表由两个文件描述符共享。 因此,如果您 write 来自一个文件描述符的内容,然后再次 write 来自其他文件描述符的内容,那么它不会被覆盖。

      但是如果两个独立的进程打开一个文件,那么两个进程写入的数据可能会混在一起。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-08
        • 1970-01-01
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        • 2012-07-04
        相关资源
        最近更新 更多