Process

文件描述符連結的可移植性

  • December 17, 2020

我一直想知道這一點,但從來沒有花時間去發現,所以我現在就這樣做 -此處顯示的使用/proc/$$/fd/$Nor的便攜性如何/dev/fd/$N?我了解POSIX 保證(儘管前幾天我在閱讀有關 此答案/dev/null, /dev/tty, and /dev/console *的評論後才發現這一點)*但是其他人呢?

據我所知,它們很常見,但我不能指望在哪些系統中找到它們?為什麼不?找到一個比另一個更有可能嗎?他們會一直表現出相似的屬性嗎?

我傾向於以各種方式廣泛使用這些設備,我想知道是否有機會我只是嘗試一下。

上述問題也應該理解為只是我我想知道的,但是,由於我顯然首先要問,所以我在這方面可能不是最了解的,它們不應該被認為是嚴格的要求答案。如果可以的話,請告訴我。

符號連結在 Linux 上是准通用的,但它們在其他任何地方都不存在(除了在模擬它們的 Cygwin 上)。AIX 和 Solaris 上也存在,但它們不是符號連結。可移植地,要獲取有關打開文件的資訊,請安裝./proc/*PID*/fd/*NUM*``/proc/*PID*/fd/*NUM*``lsof

/proc/*PID*/fd

Linux

在 Linux 下,是一個有點神奇的符號連結,指向 ID 為PID的程序在文件描述符**NUM上打開的文件。這個連結很神奇,例如,即使文件被刪除,它也可以用來訪問文件。該連結也將通過重命名來跟踪文件。是一個神奇的符號連結,它指向PID是訪問連結的程序。/proc/*PID*/fd/*NUM*``/proc/self``/proc/*PID*

這個特性幾乎存在於所有 Linux 系統上。它由proc 文件系統的驅動程序提供,它在技術上是可選的,但用於很多事情(包括製作ps工作 - 它從 讀取),即使在嵌入式系統上也幾乎從不遺漏。/proc/*PID*

賽格溫

Cygwin 模擬 Linux (用於 Cygwin 程序)和./proc/*PID*/fd/*NUM*``/proc/self

Solaris(自 2.6 版起)、AIX

每個文件描述符都有條目,但它們顯示為與打開的文件相同的類型,因此它們不提供有關文件路徑的資訊。但是,它們報告的資訊與向打開文件的程序報告的資訊相同,因此可以確定文件位於哪個文件系統及其 inode 號。目錄顯示為符號連結,但它們是只能跟隨的魔法符號連結,並返回一個空字元串。/proc/*PID*/fdstatfstatreadlink

在 AIX 下,該procfiles命令顯示有關程序打開文件的一些資訊。在 Solaris 下,該pfiles命令顯示有關程序打開文件的一些資訊。這不包括文件的路徑(在 Solaris 上,它從 Solaris 10 開始,見下文)。

Solaris(從版本 10開始)

此外,現代 Solaris 版本還包含類似於 Linux 中的符號連結的符號連結。該命令顯示有關程序打開文件的資訊,包括路徑。/proc/*PID*/fd/*NUM*``/proc/*PID*/path/*NUM*``/proc/*PID*/fd/*NUM*pfiles

計劃9

/proc/*PID*/fd是一個文本文件,其中包含一個由程序打開的每個文件描述符的記錄(行)。那裡不跟踪文件名。

QNX

/proc/*PID*/是一個目錄,但它不包含有關文件描述符的任何資訊。

具有/proc但不能直接訪問文件描述符的Unices

(注意:有時可以通過瀏覽程序的記憶體映像來獲取有關程序打開文件的資訊,該映像可在 下訪問/proc。我不認為這是“直接訪問”。)

文件在哪裡/proc/*PID*

proc 文件系統本身開始於 UNIX 第 8 版,但具有不同的結構,並經歷了 Plan 9 並回到了一些 unices。/proc我認為所有具有每個 PID 的作業系統都有一個條目,但在許多系統上,它是一個正常文件,而不是一個目錄。以下系統有一個需要閱讀的內容:/proc/*PID*``ioctl

  • 最高2.5的 Solaris
  • OSF/1 現在稱為Tru64
  • 鳶尾花(?)
  • 上海合作組織(?)

迷你 3

MINIX 3 有一個procfs 伺服器,它提供了幾個類似 Linux 的組件,包括目錄。然而沒有。/proc/*PID*/``/proc/*PID*/fd

自由BSD

FreeBSD 有目錄,但它們不提供有關打開文件描述符的資訊。(然而,它類似於 Linux 的,通過符號連結提供對執行檔的訪問。)/proc/*PID*/``/proc/*PID*/file``/proc/*PID*/exe

FreeBSD 的 procfs 已棄用

沒有/proc

  • 惠普-UX
  • OpenBSD
  • NetBSD
  • Mac OS X

通過其他渠道的文件描述符資訊

定影器

fuser命令列出打開指定文件或在指定掛載點打開文件的程序。該命令是標準的(適用於所有符合XSI的系統,即帶有 X/Open 系統介面擴展的 POSIX)。

您不能使用此實用程序從程序轉到文件名。

函式

Lsof 代表“列出打開的文件”。它是一個第三方工具,可用於大多數 unix 變體(但通常不是預設安裝的一部分)。獲取有關打開文件的資訊非常依賴於系統,因為上面的分析可能讓您懷疑。lsof 維護者已經完成了將所有這些組合在一個界面下的工作。

您可以閱讀常見問題解答以了解 lsof 必須忍受哪些困難。在大多數 unice 上,獲取有關打開文件名稱的資訊需要解析核心資料結構。引用 FAQ 3.3 “為什麼 lsof 不報告完整路徑名?”:

lsof 無法從以下方言的核心名稱記憶體中獲取路徑名組件:

  • 艾克斯

只有 Linux 核心在它維護的關於打開文件的結構中記錄完整的路徑名;相反,大多數核心將路徑名轉換為設備和節點號雙字節,並在打開文件後將它們用於後續文件引用。

如果您需要從lsof的輸出中解析資訊,請務必使用-F模式(每行一個欄位),最好使用-F0模式(以空分隔的欄位)。要獲取有關特定程序的特定文件描述符的資訊,請使用帶有and的-a選項,例如。-p *PID*``-d *NUM*``lsof -a -p 123 -d 0 -F0n

/dev/fd/*NUM*對於目前程序的文件描述符

許多 unix 變體為程序提供了一種通過文件名訪問其打開文件的方法:打開相當於呼叫. 當程序想要一個文件名但你想傳遞一個已經打開的文件(例如管道或套接字)時,這些名稱很有用;例如,實現程序替換的 shell在可用的地方使用它們(在不可用的地方使用臨時命名管道)。/dev/fd/*NUM*dup(*NUM*)/dev/fd

/dev/fd存在的地方,通常(總是?)同義詞(有時是符號連結,有時是硬連結,有時是具有等效屬性的魔術文件)/dev/stdin= /dev/fd/0/dev/stdout= /dev/fd/1/dev/stderr= /dev/fd/2

  • 在 Linux 下,/dev/fd是指向/proc/self/fd.
  • 在大多數 unices(IRIXOpenBSDNetBSD、SCO、Solaris等)下,其中的條目/dev/fd是字元設備。無論文件描述符是否打開,它們通常都會出現,並且條目可能不適用於超過特定數量的文件描述符。
  • 在 FreeBSD 和 OSX 下,fdescfs文件系統提供了一個動態/dev/fd目錄,該目錄遵循呼叫程序的打開描述符。如果未安裝,則靜態/dev/fd可用。/dev/fd
  • 在 OSF/1 (Tru64) 下,/dev/fd通過fdfs提供。
  • /dev/fd在 AIX 或 HP-UX 上沒有。

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