Kernel

不同程序中的同一個fd如何指向同一個文件?

  • July 13, 2020

假設我有process 1process 2。兩者都有一個對應於整數 4 的文件描述符。

然而,在每個程序中,文件描述符 4 指向核心的 Open File Table 中完全不同的文件:

在此處輸入圖像描述

這怎麼可能?文件描述符不應該是打開文件表中記錄的索引嗎?

文件描述符,即在您的範例中,是特定於程序的文件描述符表4的索引,而不是打開的文件表。文件描述符條目本身包含核心全域打開文件表中條目的索引,以及文件描述符標誌。

每個程序都有自己的文件描述符表。程序 1234 中的文件描述符 4 指向程序 1234 的表內。程序 5678 中的文件描述符 4 指向程序 5678 的表內。您必須熟悉的情況是文件描述符 0、1 和 2,對於每個程序,它們是標準輸入、標準輸出和標準錯誤,指向這些重定向到的任何位置。

一個程序可以多次打開同一個文件。這可能是偶然發生的,例如當一個程序的標準輸出和標準錯誤被重定向到同一個終端或同一個文件時。底層文件表條目(例如Linux 的struct file)攜帶的不僅僅是關於文件的資訊;它們還包含打開模式(例如讀取或寫入)和其他狀態(例如標誌,例如 close-on-exec)。例如,一個程序可能打開一個終端以僅在文件描述符 0 上讀取,而同一終端打開以僅在文件描述符 2 上寫入。文件表條目還包含程序在文件中的位置;一個程序可能想要到lseek同一個文件中的兩個不同位置,因此會使用dup來獲取該文件的兩個句柄。

引用自:https://unix.stackexchange.com/questions/28384