簡體   English   中英

在父進程和子進程中寫入相同的文件描述符時,我應該注意哪些“陷阱”?

[英]What "gotchas" should I be aware of when writing to the same file descriptor in a parent and child process?

背景:我在 Linux 上的 C(和非常 C-ish C++)中工作。 父進程有一個打開的文件描述符,它以“分段”格式寫入數據。 子進程將它用於同樣的目的。 只要子進程正在運行,就可以保證父進程不會嘗試向其文件描述符副本寫入更多數據。 子進程退出,父進程等待它,然后它將更多數據寫入文件。

似乎工作正常,但我仍然懷疑它。 我需要在父項中重新尋找到底嗎? 我需要處理任何同步問題嗎?

如果您在談論 POSIX 文件描述符,那么對文件描述符的每個write調用都是原子的,並且會影響底層 kernel 資源 object 獨立於其他進程可能對引用相同 ZA8CFDE6331BD59EB2AC96B6668 的文件描述符所做的事情如果兩個進程幾乎同時write ,則操作將由 kernel 排序,其中一個完全發生(盡管它可能寫入的數據少於請求的數據),然后另一個發生。

在您的情況下,聽起來您正在同步,以便您知道所有父級寫入都發生在子級開始之前(在fork之前)或在它完成之后(在wait之后),這保證了write調用的順序。

文件描述符一般來自Unix,特別是Linux,很多行為都是POSIX標准化的。 您說父進程和子進程共享相同的文件描述符。 那是不可能的; 文件描述符特定於一個進程。

假設父打開一個文件(假設文件描述符為3 ),因此還有一個新的打開文件描述; 然后父進程分叉。 在 fork 之后,每個進程都有一個單獨的文件描述符(但它們都使用文件描述符3 ),但它們共享相同的打開文件描述。 是的:“打開文件描述符”和“打開文件描述”是不同的,每個打開的文件描述符都有一個打開的文件描述,但是一個打開的文件描述可以與許多打開的文件描述符相關聯。 並且這些描述符不需要都與同一個進程相關聯。

打開文件描述中的關鍵數據位之一是當前的 position(用於讀取或寫入 - 此處最重要的是寫入)。 因此,當孩子寫入時,當前的 position 會同時為父母和孩子移動。 因此,無論何時父母寫,它都會在孩子寫完的位置之后寫。

你所看到的是有保證的。 至少在父級打開文件和分叉的情況下。

請注意,在所討論的場景中,不需要或不相關O_APPEND標志。 但是,如果您擔心它,可以使用O_APPEND標志打開文件,然后每次正常寫入(不是通過pwrite()寫入)都會將數據寫入文件的當前末尾。 即使兩個進程不共享相同的打開文件描述,這也將起作用。

POSIX 規范:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM