文件描述符與文件名
我想知道文件描述符和文件名之間有什麼區別和關係。它們都用於訪問文件嗎?如果是,以同樣的方式?
例如,
/dev/fd/0
、/dev/stdin
和/proc/self/fd/0
都是指向 的連結/dev/pts/2
。這四個是文件描述符,還是文件名?
/dev/fd/0
,/dev/stdin
,/proc/self/fd/0
和中的所有四個/dev/pts/2
都是文件名,就像/////dev/../dev/fd//0
,/bin/sh
,/etc/fstab
,/fioejfoeijf
等一樣。除了最後一個範例之外的所有文件都可能是您機器上現有文件的名稱。文件名是一個字元串,可以指定文件系統上的文件;在 Linux 下,任何不包含空字節且長度最多為 4096 字節的字元串都是有效的文件名。其中許多名稱是等價的,例如/bin/sh
,等價於///bin/sh
,/bin/../bin/sh
(假設/bin
是現有目錄)等。到目前為止我給出的所有範例都是絕對文件名;還有相對文件名,它們不以 a 開頭,/
其含義取決於目前目錄。圍繞文件名的術語並不通用。有時“文件名”表示文件的完整路徑,有時表示目錄條目的名稱。POSIX 術語是“文件名”或“路徑名組件”表示目錄條目的名稱,“路徑名”表示完整路徑。
文件描述符指定特定程序中*打開的文件。*核心為每個程序維護一個文件描述符表。文件描述符表中的每個條目都指示瞭如果程序請求對文件描述符進行讀取、寫入和其他操作時要執行的操作。
文件描述符可能對應於一個文件並具有關聯的名稱,但並非所有文件都如此。對於那些這樣做的人,文件可能是正常文件、目錄、設備文件或命名管道(也稱為 FIFO)(由創建的那種
mkfifo
);一些系統還有更多的可能性,例如 Unix 套接字和門。沒有關聯命名文件的文件描述符的範例包括管道(由pipe
系統呼叫創建的那種)和網路套接字。
/dev/fd/0
,/dev/stdin
並且/proc/self/fd/0
是具有特殊含義的文件名(都是等效的):它們都指定目前通過文件描述符 0 訪問的任何文件。當程序打開這些文件時,核心將文件描述符表中索引為 0 的條目複製到新描述符. 打開這些文件中的任何一個都相當於呼叫dup(0)
. 命名文件是一種間接讓程序使用其已打開文件而不是打開新文件的方法;它們對於傳遞程序的命令行非常有用,程序希望在其中打開文件的名稱。