procfs會告訴我一個進程在任何給定時間使用哪個fds。但是,有沒有辦法確定哪些閱讀與寫作是開放的?是否有可能通過procfs確定哪個fds進程已經打開以便讀取或寫入?
在下面的輸出中,顯然進程所有者(用戶'x')具有對鏈接/文件的讀/寫訪問權限,但這與知道pid 4166是寫入還是讀取特定FD。
$ ls -l /proc/4166/fd/ total 0 lrwx------ 1 x x 64 Mar 12 21:15 0 -> /dev/pts/3 lrwx------ 1 x x 64 Mar 12 21:15 1 -> /dev/pts/3 lrwx------ 1 x x 64 Mar 12 21:15 2 -> /dev/pts/3 lrwx------ 1 x x 64 Mar 12 21:15 255 -> /dev/pts/3
我知道lsof的實用工具可以做到這一點:
$ lsof -p 4166 | grep CHR bash 4166 x 0u CHR 136,3 0t0 6 /dev/pts/3 bash 4166 x 1u CHR 136,3 0t0 6 /dev/pts/3 bash 4166 x 2u CHR 136,3 0t0 6 /dev/pts/3 bash 4166 x 255u CHR 136,3 0t0 6 /dev/pts/3
的lsof的聯機幫助頁說,例如那些尾隨將U的FD後面的數字(0,1,2,255)是指fd開放閱讀和寫作。
我的問題是,是否有可能通過procfs而不是lsof獲取這些信息。出於各種原因,在另一種編程語言中執行lsof對於我來說比調用procfs更不方便,所以我想知道是否有直接的方法可以在那裏執行。
這裏要做的很明確的一點是:爲什麼不研究lsof來源並看看它是如何完成的? –
因爲在我的各種安裝中,我不能總是確定它將被安裝,並且我不會始終擁有根。而且,由於讀取/掃描標準化文件系統(procfs)比在java程序內部試圖解析管道中的lsof輸出更加簡單和可靠。而且因爲我擔心不同版本的lsof會根據環境產生稍微不同的輸出。 – FrobberOfBits
我的意思是讀取lsof的源代碼,然後根據它製作自己的程序。 –