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.
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.
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
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);
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.
There is no portable way to get the number of open descriptors (regardless of type), unless you keep track of them yourself.