Linux

/proc/pidp一世dpid/fd/0,1,20,1,20, 1, 2:沒有這樣的文件或設備 - 即使文件存在

  • October 8, 2020

我正在嘗試stdio從其父程序外部訪問程序的流。我找到了/proc/[pid]/fd目錄,但是當我嘗試時

$ cat /proc/[pid]/fd/1

我得到一個No such file or device錯誤。我確定它存在,正如 Dolphin(文件瀏覽器)顯示的那樣。

我還碰巧注意到文件資源管理器將其列為套接字並嘗試按照此處的建議從中讀取會產生類似的錯誤。這對我來說似乎很奇怪,因為stdio流通常是管道,而不是套接字,所以我不確定這裡有什麼。

我還想指出,這些程序是由同一個使用者啟動的,並且嘗試訪問它sudo也不起作用。如果這個問題看起來很無聊,我深表歉意,但我真誠地感謝一些指導 - 也許有更好的方法來訪問 stdio 管道?

tl;博士; /proc/<pid>/fd/<fd>截至 2020 年,如果是套接字,則不能這樣做(或類似的事情) 。

程序的stdin、stdout、stderr可以是任何類型的文件,不一定是管道、正常文件等。它們也可以是套接字。

在 Linux 上,這/proc/<pid>/fd/<fd>是一種特殊的符號連結,它允許您從頭開始打開文件描述符所引用的實際文件,即使該文件已被刪除,或者它在任何文件中都不存在,也可以這樣做完全是文件系統(例如,使用創建的文件memfd_create(2))。

但是套接字是一個值得注意的例外,它們不能以這種方式打開(如何實現這一點也不明顯:如果該 fd 是連接的套接字, open()on是否會/proc/<pid>/fd/<fd>創建另一個到伺服器的連接?如果套接字是顯式的呢?綁定到本地埠?)。

最近版本的 Linux 核心引入了一個新的系統呼叫,pidfd_getfd(2)它允許您從另一個程序“竊取”文件描述符,就像您能夠通過 Unix 套接字傳遞它一樣,但無需受害程序的協作。但這還沒有在大多數 Linux 發行版中實現。

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