Devices

ll /proc/self/fd/(來自ll /dev/fd)的輸出是什麼意思?

  • November 9, 2021

相關但重複:

  1. /dev/fd 不一致
  2. /dev/fd 與 /proc/self/fd/ 有何關係?
  3. 為什麼程序替換會生成一個名為 /dev/fd/63 的文件,它是一個管道?

在 Ubuntu 中alias ll='ls -alF'定義的Ubuntu 18.04 和 20.04 上,我看到“磁片驅動器”設備~/.bashrc的以下輸出:/dev/fd

對於ls

$ ls /dev/fd
0  1  2  3

對於ll

$ ll /dev/fd
lrwxrwxrwx 1 root root 13 Nov  5 11:46 /dev/fd -> /proc/self/fd/

我可以看到/dev/fd是一個符號連結/proc/self/fd/,所以我ll看到了:

$ ll /proc/self/fd/
total 0
dr-x------ 2 username username  0 Nov  8 19:01 ./
dr-xr-xr-x 9 username username  0 Nov  8 19:01 ../
lrwx------ 1 username username 64 Nov  8 19:01 0 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 1 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 2 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 3 -> 'socket:[8239772]'
lr-x------ 1 username username 64 Nov  8 19:01 4 -> /proc/29512/fd/
  1. 所有這些東西是什麼意思?
  2. 磁片在這裡是如何工作的?
  3. 什麼是/dev/pts/6, 為什麼0,12都指向它?
  4. 是什麼'socket:[8239772]'
  5. 是什麼/proc/29512/fd/
  6. 的歷史用途和描述是/dev/fd什麼?

有關的:

  1. 我之前的問題啟發了我提出這個問題:’-sh:語法錯誤:在使用 bash 嘗試在嵌入式 Linux 設備上進行程序替換時出現意外的“(”)

所有這些東西是什麼意思?

/proc是一個文件系統,核心通過它向程序報告各種資訊。它主要用於有關程序的資訊,因此名稱為“proc

$$ esses $$”。對於每個正在執行的程序,都有一個子目錄/proc/<PID>,其中<PID>是程序 ID。 /proc/self是一個“神奇”的符號連結,它始終指向正在訪問的程序/proc

/proc/self/fd報告程序打開的文件。每個條目都是一個“魔術”符號連結,其名稱是文件描述符,其目標是打開的文件。從某種意義上說,連結實際上指向文件本身是很神奇的,即使通過呼叫獲得的文件名readlink不是有效的文件名,例如,對於沒有名稱的文件(例如匿名管道和套接字),以及已刪除的文件。

lrwx------ 1 username username 64 Nov  8 19:01 0 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 1 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 2 -> /dev/pts/6
lrwx------ 1 username username 64 Nov  8 19:01 3 -> 'socket:[8239772]'
lr-x------ 1 username username 64 Nov  8 19:01 4 -> /proc/29512/fd/

磁片在這裡是如何工作的?

不涉及磁片。縮寫“fd”代表文件描述符

什麼是/dev/pts/6, 為什麼0,12都指向它?

文件描述符0和是所有程序都希望找到12三個標準流:標準輸入(stdin)、標準輸出(stdout)和標準錯誤(stderr)。這些流由它們的編號定義:stdin 定義為文件描述符 0,其正常作用是接收使用者輸入或輸入數據,對於 stdout(1,使用者輸出或輸出數據)和 stderr(2,錯誤消息)也是如此.

/dev/pts/6是一個終端。它是程序用來從該特定終端讀取輸入並將輸出寫入該特定終端的文件。當您在終端中“正常”執行程序時,stdin、stdout 和 stderr 都連接到終端。

是什麼'socket:[8239772]'

這是一個插座。文件描述符 3 沒有標準角色,因此它特定於您正在使用的某些軟體,可能是您的終端模擬器。如果你好奇的話,你可以看看插座的另一端是什麼。

是什麼/proc/29512/fd/

執行ls /proc/self/fd/時,ls程序會打開/proc/self/fd以讀取其內容。由於文件描述符 0 到 3 在ls啟動時已經打開,並open使用第一個可用的文件描述符,/proc/self/fd最終在文件描述符 4 上打開。它與 PID 一起出現是因為核心不跟踪/proc/self內部訪問:它會記住它們作為特定程序的/proc目錄,然後使用正確的 PID 將其列印出來。(使用PID 命名空間,該 PID 以及路徑可能會有所不同,具體取決於正在查找的程序。)

的歷史用途和描述是/dev/fd什麼?

當程序需要文件名並且您想要引用已經打開的文件時,它很有用。它是/dev/stdin,/dev/stdout/dev/stderr, 分別等價於/dev/fd/0,/dev/fd/1和的概括/dev/fd/2(並且在更一般的/dev/fd出現之前就存在了)。它適用於許多 unix 變體

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