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

时间:2011-03-12 17:13:57

标签: linux file posix file-descriptor

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

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

3 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:1)

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

  

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

答案 2 :(得分:0)

当您使用dup()dup2()fork()时, 文件表由两个文件描述符共享。 所以如果你从一个文件描述符中write某个东西,再通过其他文件描述符再次write,那么它就会被附加而不被覆盖。

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