簡體   English   中英

POSIX進程和文件描述符

[英]POSIX process and file descriptors

我是C下的進程用法的新手,我有一個與子進程中文件描述符的linux行為有關的問題。

我發現以下信息:子進程和父進程之間共享文件描述符,數字0、1,2的文件描述符是標准輸入輸出和錯誤,因此我認為如果分叉該進程,我將擁有相同的信息輸入和輸出目錄,但是當我在子進程中更改它時,它們在父進程中沒有更改。 我的問題是,它是否適用於每個文件描述符,因此,如果我決定說覆蓋子進程中的文件描述符編號100,則在子進程和父進程中會有所不同,或者僅文件描述符0、1、2被認為是特殊的。

最好的祝福

POSIX線程實際上與fork無關,所以我假設您是在談論進程而不是線程。 對於線程,沒有父級和子級的概念,並且它們共享相同的數據。

對於進程,每個進程都有自己的唯一文件描述符集,一個很小的非負數(不是文件句柄,這是C的概念)。

但是,這些文件描述符都指向共享池中的條目(例如,在內核內部)。 這允許所有進程具有自己的標准輸入,輸出和錯誤(描述符0、1和2),但有可能它們可以引用相同的“備份文件”。

因此,當您的進程派生時,它會獲得自己的文件描述符,但它們指向與父進程相同的共享池條目。

如果孩子隨后去關閉其文件描述符並重新打開它以指向其他位置,則僅影響孩子,而不影響父對象。

因此,假設您有兩個叉產生了三個進程,並且進程C已關閉並重新打開其標准輸出以轉到文件。 這是關於您所處情況的(某種)圖形指示:

Individual processes          Shared pool
          +------+            +------------------+
Process A | fd 1 | ----+----> | maps to /dev/tty |
          +------+     |      +------------------+
Process B | fd 1 | ----+
          +------+            +------------------+
Process C | fd 1 | ---------> | maps to new file |
          +------+            +------------------+

對於三種標准描述符,此行為絕非特殊,它適用於所有標准描述符。 實際上,描述符不僅可以保留在fork ,而且還可以(通常)通過exec生存,這使重定向在類似UNIX的操作系統下工作。 如果要使它在exec上自動關閉,則必須顯式標記一個描述符。

您可以將文件描述符視為數組的索引。 因此,對於標准輸入/輸出/錯誤的描述符,確實沒有什么特別的。

一旦分叉了該過程,就會有兩個這樣的數組,一個用於父級,一個用於子級。 因為它們被復制,所以它們的開始都是一樣的,但是一旦不同的進程開始打開和關閉其他文件描述符,它們將開始偏離。

子進程在fork()時獲取父級的打開文件表的副本 ,但是此后,父級或子級的任何更改(例如,打開新文件描述符或關閉現有的文件描述符)都不會反映在另一個。 在這方面,文件描述符0、1和2沒有什么特別的。

但是請注意,即使復制了打開的文件表(即文件描述符集),那些描述符所引用的打開文件也不會被復制。 這意味着對打開文件的更新(例如,使用lseek()更改當前文件位置)會影響這兩個過程。

線程是另一回事。 同一進程中的線程共享相同的打開文件表,因此所有線程都可以看到一個線程中的更改。 同樣,在這方面,文件描述符0、1和2沒有什么特別的。

暫無
暫無

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

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