File-Descriptors

找出哪些文件描述符共享相同的“打開文件描述”

  • October 23, 2020

如果我這樣做(在類似 Bourne 的外殼中):

exec 3> file 4>&3 5> file 6>> file

文件描述符 3 和 4,因為 4 是dup()從 3 編輯的,所以共享相同的打開文件描述(相同的屬性,文件內的相同偏移量……)。雖然該程序的文件描述符 5 和 6 位於不同的打開文件描述中(例如,它們在文件中都有自己的指針)。

現在,在lsof輸出中,我們看到的是:

zsh     21519 stephane    3w   REG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    4w   REG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    5w   REG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    6w   REG  254,2        0 10505865 /home/stephane/file

使用以下內容會更好一些lsof +fg

zsh     21519 stephane    3w   REG          W,LG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    4w   REG          W,LG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    5w   REG          W,LG  254,2        0 10505865 /home/stephane/file
zsh     21519 stephane    6w   REG       W,AP,LG  254,2        0 10505865 /home/stephane/file

(這裡在 Linux 3.16 上)因為我們看到 fd 6 有不同的標誌,所以它必須是與 fd 3、4 或 5 上的不同的打開文件描述,但是我們不能告訴 fd 5 在不同的打開文件描述。使用-o,我們還可以看到偏移量,但同樣的偏移量並不能保證它是相同的打開文件描述

有沒有非侵入性的1方法可以找出答案?是外部的,還是程序自己的文件描述符?


1 . 一種啟發式方法可能是更改一個 fd 的標誌fcntl()並查看其他文件描述符的標誌因此而更新,但這顯然不是理想的,也不是萬無一失的

對於 Linux 3.5 及更高版本,這可以通過kcmp(2)完成:

KCMP_FILE

  • 檢查程序pid1中的文件描述符idx1是否與程序pid2中的文件描述符idx2引用相同的打開文件描述(參見open(2))。由於dup(2)(和類似的)fork(2)或通過域套接字傳遞文件描述符(參見unix(7) ),可能會出現引用相同打開文件描述的兩個文件描述符的存在。

手冊頁提供了一個專門針對 OP 詢問的案例的範例。請注意,此系統呼叫需要使用CONFIG_CHECKPOINT_RESTOREset 編譯核心。

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