2011-11-17 49 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系统之间。

相关问题