2015-04-28 200 views
2

1)爲了獲得打開的文件描述符的總數,是否可以循環使用/proc? 我用下面的顯示目錄:Linux實現打開的文件描述符C

/proc/PID/fd/* 
/proc/PID/maps 
/proc/PID/cwd 
/proc/PID/root 
/proc/PID/exe 

2)的數目不同於lsof | wc -lcat /proc/sys/fs/file-nr

3)加載動態鏈接庫和當前工作目錄可以算作打開文件描述符? 實現在C中的所有打開的文件描述符的Linux

回答

1

你怎麼指望這取決於你是什麼樣的信息感興趣。

通過/proc/PID/fd/*展望會給你打開的文件描述符的數量。但是,有一點需要注意的是,兩個進程可能實際上共享一個文件描述符,如果分叉,那麼子進程會從其父進程繼承文件描述符,然後此方法將計算兩次,每個進程計數一次。

/proc/PID/maps將向您顯示進程的內存映射,其中可以包括加載的可執行文件本身和動態鏈接的庫,但也包括與堆,堆棧,vdso節等文件不對應的內容內核導出的虛擬共享對象,等等。

lsof將列出文件可以使用的各種方式,其中不僅包括文件描述符,它也包括可執行文件和共享庫,但不包括不對應於在/proc/PID/maps像棧,堆vdso部顯示的文件存儲區域等

/proc/sys/fs/file-nr將報告數量不限內核文件句柄。內核文件句柄不同於文件描述符;可以有多個文件描述符打開,指向相同的文件句柄,例如通過調用dupdup2

這些差異可以解釋爲什麼從這些不同的計數方式中獲得不同的數字。問題是,你使用這個計數的目的是什麼?這將有助於回答您應該實際使用哪種計數方式。

+0

謝謝你的回答,非常豐富。目的是監視打開的文件描述符,據我所知,我不需要查看映射和文件nr。 – Adelina

1

1)沒有,但似乎你都搞不清楚是什麼構成一個打開的文件描述符,通過你的第二個問題

2)看http://codingtragedy.blogspot.com/2015/04/nofile-ulimit-n-rlimitnofile-most.html的建議 - 雖然它解釋了對似乎不相關的資源限制的處理,它還解釋了文件描述符與最有可能需要的「結構文件」之間的區別,它甚至涵蓋了您的使用情況。

3)同樣,目前還不清楚你的實際問題是什麼。當前工作目錄不是文件描述符,並且只用inode表示。一個進程可能會或可能不會爲鏈接庫保留fd,但映射本身佔用一個「結構文件」。