2014-03-13 53 views
2

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更不方便,所以我想知道是否有直接的方法可以在那裏執行。

+2

這裏要做的很明確的一點是:爲什麼不研究lsof來源並看看它是如何完成的? –

+0

因爲在我的各種安裝中,我不能總是確定它將被安裝,並且我不會始終擁有根。而且,由於讀取/掃描標準化文件系統(procfs)比在java程序內部試圖解析管道中的lsof輸出更加簡單和可靠。而且因爲我擔心不同版本的lsof會根據環境產生稍微不同的輸出。 – FrobberOfBits

+2

我的意思是讀取lsof的源代碼,然後根據它製作自己的程序。 –

回答

2

我按照建議鑽通了lsof代碼,找到了答案。

本質上lsof的實用工具中打開文件/proc/XX/fdinfo/YY其中XX是進程PID和YY是文件描述符數。每個這些文件是一個很小的文本文件,它看起來像這樣:

 
[email protected]:/proc/6095/fdinfo$ cat 8 
pos: 0 
flags: 02004002 

諮詢額外的聯機幫助頁的「標誌」字段是指傳遞到開放系統命令relevant man page for open(2) here標誌。所以只是爲了讓它更難一點,當然open()象徵性地,而不是數字地定義所有這些標誌。那麼02004002(上面的例子)的標誌是什麼意思?

我發現定義爲的libc6-dev的一部分,在/usr/include/i386-linux-gnu/bits/fcntl-linux.h,包括這些摘錄:(因爲它們可能會有所不同警告不要爲你的系統相信這些價值觀,看看他們自己)

 
# define O_CREAT   0100 
# define O_APPEND   02000 
#define O_ACCMODE   0003 
#define O_RDONLY    00 
#define O_WRONLY    01 
#define O_RDWR    02 
# define O_CREAT   0100 /* Not fcntl. */ 
# define O_TRUNC   01000 
# define __O_DIRECTORY 0200000 
# define O_DIRECTORY __O_DIRECTORY /* Must be a directory. */ 
# define O_NONBLOCK  04000 
# define __O_CLOEXEC 02000000 

所以給定標誌:02004002,該文件看起來像是可讀/寫(02),非阻塞(4000),執行關閉(2000000)。

HTH其他人對這些問題感到困惑。

相關問題