2011-03-12 72 views
11

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

我相信是这样的话,但我想,以确保和手册页是不会在这个

回答

17

这取决于你得到两个文件描述符的位置。如果它们来自dup(2)调用,那么它们共享文件偏移和状态,因此在其中一个写入(2)会影响另一个的位置。另一方面,如果它们来自两个独立的公开(2)呼叫,则每个呼叫都会有自己的文件偏移和状态。

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

+0

如果我在每个单独使用单独的open()调用时该怎么办......将来自写入的fd的数据是否可用于读取fd? – 2011-03-12 18:47:43

+2

有两个独立的公开呼叫,每个fd都有自己的位置。因此,如果两者都在文件的开头,并且您使用一个写入,另一个将仍然在文件的开头,因此写入的内容会覆盖首次写入的内容,除非您使用O_APPEND打开文件(在在写作之前,每一个写作都隐含地寻求到底)。 – 2011-03-15 05:08:05

+4

谢谢克里斯。我的问题有点不同,但是,如果第二个人正在阅读,它会读取第一个人写的内容。对于我的问题来说,是的,它确保了在写入之后从文件中读取的任何人都将读取写入的内容。这是因为linux锁定访问内存中的io缓存页面 – 2011-03-16 00:34:17

1

,如果他们都指向同一个文件的描述,这是保证你又名从得到了他们很大的帮助“dup”或“dup2”(或通过fork()继承)。

从 一个成功返回后,这些系统调用,新老 文件描述符可以互换使用 。他们参考 相同的打开文件描述(请参阅 打开(2)),因此共享文件偏移量 和文件状态标志;例如,如果 的文件偏移量使用 lseek(2)在其中一个描述符 上修改,则其偏移量也会更改为其他 。

0

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

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