2011-03-12 85 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的東西,那麼它就不會被覆蓋。

但是,如果兩個獨立的進程打開一個文件,則兩個進程寫入的數據可能會混合在一起。