2017-07-10 98 views
2

是否可以通過編程的方式找出已打開的對象在Linux上由給定的文件描述符引用的對象的計數?對文件描述符引用的對象的引用計數

如果是,是否有任何區別,如果它是一個文件,管道或其他?

+0

AFAIK,沒有一個標準的方法來做到這一點。你無疑可以通過在'/ dev/kmem'中咕嚕找到;儘管不太可能,但可以通過'/ proc'文件系統找到。文件的類型不應該有任何區別。您可能會注意到只有一個進程可以打開給定的文件描述符。然後它可以創建它自己的副本('dup2()'等),或者它可以用它的副本創建新進程('fork()'等)。跨多個進程的單個文件可能有多個打開的文件描述,以及多個進程共享單個打開的文件描述。 –

+0

你問有多少進程正在打開文件? AFAIK文件描述符是該進程獨有的。 –

+0

@ed是的,我的意思是打開文件,管道或其他東西的進程數。 – stuhlo

回答

2

奇怪的是,fuser程序及其輸出已被POSIX標準化。你可以使用popen來調用它並解析它的輸出。除非用戶有特權,否則該列表將不完整,並且這種方法本身容易出現競賽。

在Linux上,您可以讀取/proc/*/fd目錄的內容並檢查是否引用了相同的文件描述符。 (如果您對同一個文件的引用感興趣描述對象(共享不只是相同的文件,但也是相同的文件偏移量,因爲它們是由dup/dup2fork創建的) ,您必須使用kcmp系統調用進一步進行過濾。