Find current number of open filehandle ( NOT lsof

2019-04-28 05:55发布

问题:

On *NIX systems, is there a way to find out how many open filehandles are there in the current running process?

I am looking for an API or a formula for use in C, from within the running process in question.

回答1:

On certain systems (see below) you can count them in /proc/[pid]/fd. If not on one of those, see below for: wallyk's answer.

In c, you can list the dir and count the total, or list the dir contents:

 #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;
 }

In bash, something like:

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

Operating systems that support the proc filesystem include, but are not limited to:
Solaris
IRIX
Tru64 UNIX
BSD
Linux (which extends it to non-process-related data)
IBM AIX (which bases its implementation on Linux to improve compatibility)
QNX
Plan 9 from Bell Labs



回答2:

An idea which comes to mind which should work on any *nix system is:

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);


回答3:

OpenSSH implements a closefrom function that does something very similar to what you need mixing the two approaches already proposed by wallyk and chown, and OpenSSH is very portable, at least between Unix/Linux/BSD/Cygwin systems.



回答4:

There is no portable way to get the number of open descriptors (regardless of type), unless you keep track of them yourself.