Linux

/proc/PID/fd/X 連結號

  • November 22, 2013

在 Linux 中/proc/PID/fd/X,作為管道或套接字的文件描述符的連結有一個數字,例如:

l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 -> socket:[3142930]
lrwx------ 1 user user 64 Mar 24 00:05 8 -> socket:[3142932]
lr-x------ 1 user user 64 Mar 24 00:05 9 -> pipe:[9837788]

就像第一行:6839。這個數字代表什麼?

這是有問題的管道或套接字的inode編號。

管道是一個單向通道,有一個寫端和一個讀端。在您的範例中,看起來 FD 5 和 FD 6 正在相互通信,因為 inode 編號相同。(也許不是。見下文。)

比看到程序通過管道與自己對話更常見的是一對單獨的程序相互對話,通常是因為您使用 shell 在它們之間設置了管道:

shell-1$ ls -lR / | less

然後在另一個終端視窗中:

shell-2$ ...find the ls and less PIDs with ps; say 4242 and 4243 for this example...
shell-2$ ls -l /proc/4242/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 1 -> pipe:[222536390]
shell-2$ ls -l /proc/4243/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 0 -> pipe:[222536390]

這表示 PID 4242 的標準輸出(按照慣例,FD 1)連接到 inode 編號為 222536390 的管道,而 PID 4243 的標準輸入(FD 0)連接到同一管道。

所有這些都是說ls’ 的輸出被發送到less’ 的輸入。

回到您的範例,FD 1 和 FD 2 幾乎可以肯定不會互相交談。很可能這是將 stdout (FD 1) 和 stderr (FD 2) 捆綁在一起的結果,因此它們都去同一個目的地。你可以用這樣的 Bourne shell 來做到這一點:

$ some-program 2>&1 | some-other-program

因此,如果您在 中四處/proc/$PID_OF_SOME_OTHER_PROGRAM/fd尋找,您會發現第三個 FD 連接到管道,其 inode 編號與some-program實例中連接到 FD 1 和 2 的 inode 編號相同。在您的範例中,這也可能是 FD 5 和 6 發生的情況,但我沒有現成的理論這兩個 FD 是如何联系在一起的。你必須知道程序在內部做什麼才能弄清楚。

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