Find current number of open filehandle ( NOT lsof )

二次信任 提交于 2019-12-07 02:49:10

问题


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.



来源:https://stackoverflow.com/questions/8163757/find-current-number-of-open-filehandle-not-lsof

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!