2011-11-17 46 views

回答

6

在某些系統上(見下文),您可以在/ proc/[pid]/fd中對它們進行計數。如果不是其中之一,請參閱:wallyk's answer

在C中,你可以列出目錄,並計算總,或列出目錄內容:

#include <stdio.h> 
#include <sys/types.h> 
#include <dirent.h> 

int 
main (void) 
{ 
    DIR *dp; 
    struct dirent *ep; 

    dp = opendir ("/proc/MYPID/fd/"); 
    if (dp != NULL) 
    { 
     while (ep = readdir (dp)) 
     puts (ep->d_name); 
     (void) closedir (dp); 
    } 
    else 
    perror ("Couldn't open the directory"); 

    return 0; 
} 

在bash,是這樣的:

ls -l /proc/[pid]/fd/ | wc -l 

操作系統支持proc文件系統包括但不限於:
Solaris
IRIX
Tru64 UNIX的
BSD
Linux操作系統(其延伸到非處理相關的數據)
IBM AIX(這立足於Linux的其實施,提高的相容性)
QNX
貝爾實驗室

計劃9
+2

這不適用於例如FreeBSD系統,因爲它們沒有/ proc/filesystem。另外:這不回答OP的問題。 – arne

+0

我喜歡wallyk的答案,它更便於攜帶,並且依賴於子系統提供的很少的設施。但是,就我而言,我需要確保計算文件句柄的嘗試有很高的成功機會;即不必打開和關閉更多的文件句柄。從這個意義上說,chown的解決方案更好,因爲它只使用了一個文件句柄。 –

+2

@CodeMedic:wallyk解決方案隨時只需要一個額外的文件處理程序,因爲它在循環中打開並關閉它。 – salva

0

沒有便攜式獲取打開描述符的數量(不管類型)的方式,除非您自己跟蹤它們。

6

該想到的應該任何的* nix系統上運行的想法是:

int j, n = 0; 

// count open file descriptors 
for (j = 0; j < FDMAX; ++j)  // FDMAX should be retrieved from process limits, 
            // but a constant value of >=4K should be 
            // adequate for most systems 
{ 
    int fd = dup (j); 
    if (fd < 0) 
     continue; 
    ++n; 
    close (fd); 
} 
printf ("%d file descriptors open\n", n); 
+0

殘酷但很有趣的做法。它不能辨別「真實」文件和終端和套接字等其他字符設備。 – arne

+4

@arne:OP不要求區分。只有打開文件句柄的總數。 – wallyk

+1

這絕對是真的,但如果他只是忘了,我提到它。 – arne

1

的OpenSSH實現closefrom功能確實非常相似的東西,你需要已經wallyk提出的兩種方法混合什麼, chown,而OpenSSH是非常便攜的,至少在Unix/Linux/BSD/Cygwin系統之間。

相關問題