两个文件描述符到同一个文件

Mic*_* Xu 14 linux posix file file-descriptor

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

我相信情况确实如此,但我想确定并且手册页对此没有太大帮助

Chr*_*odd 23

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

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

  • 谢谢克里斯.我的问题有点不同,但是......如果第二个人正在阅读,它会准确地读出第一个写的内容.我的问题的答案是肯定的,它确保在写入之后从文件中读取的任何人都将读取写入的任何内容.这是因为linux锁定了对内存中io缓存页面的访问 (4认同)
  • 通过两个单独的开放式呼叫,每个fd都有自己的位置.因此,如果两者都在文件的开头,并且你用一个写入,另一个仍然在文件的开头,那么写入将覆盖第一个写入的内容,除非你用O_APPEND打开文件(在在写作之前,每一次写入都隐含地寻求结束. (2认同)