File-Descriptors
找出哪些文件描述符共享相同的“打開文件描述”
如果我這樣做(在類似 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
手冊頁提供了一個專門針對 OP 詢問的案例的範例。請注意,此系統呼叫需要使用
CONFIG_CHECKPOINT_RESTORE
set 編譯核心。