2011-11-17 8 views

Respuesta

6

En ciertos sistemas (consulte a continuación), puede contarlos en/proc/[pid]/fd. Si no está en uno de esos, vea a continuación para: wallyk's answer.

en C, se pueden listar el directorio y el recuento del total, o una lista del contenido dir:

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

En bash, algo así como:

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

sistemas operativos que soportan la el sistema de archivos proc incluye, pero son no limitado a:
Solaris
IRIX
Tru64 UNIX
BSD
Linux (que se extiende a los datos no relacionados con procesos)
IBM AIX (que basa su aplicación en Linux para mejorar la compatibilidad)
QNX
Plan 9 from Bell Labs

+2

Esto no es portátil, p. Ej. Los sistemas FreeBSD ya que no tienen el/proc/filesystem. Además: Esto no responde la pregunta del OP. – arne

+0

Me gustó la respuesta de Wallyk, es más portátil, y depende de muy pocas instalaciones proporcionadas por el subsistema. Pero, en mi caso, necesito asegurarme de que el intento de contar los identificadores de archivos tenga muchas posibilidades de tener éxito; es decir, al no tener que abrir y cerrar más identificadores de archivo. En ese sentido, la solución de chown es mejor, ya que solo utiliza un identificador de archivo más en el esfuerzo. –

+2

@CodeMedic: la solución wallyk requiere solo un manejador de archivos adicional en cualquier momento, ya que se abre y lo cierra dentro del ciclo. – salva

0

No hay portátil forma de obtener el número de descriptores abiertos (independientemente del tipo), a menos que usted realice un seguimiento de ellos.

6

una idea que viene a la mente la que debe funcionar en cualquier sistema * nix es:

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

enfoque brutal, pero muy interesante. Sin embargo, no distingue entre archivos "reales" y otros dispositivos de caracteres, como terminales y enchufes. – arne

+4

@arne: El OP no pide diferenciación. Solo la cantidad total de archivos abiertos maneja. – wallyk

+1

Eso es definitivamente cierto, pero en caso de que lo olvidara, lo mencioné. – arne

1

OpenSSH implementa la función de closefrom que hace algo muy similar a lo que necesita la mezcla de los dos enfoques ya propuestas por wallyk y chown, y OpenSSH es muy portátil, al menos entre los sistemas Unix/Linux/BSD/Cygwin.

Cuestiones relacionadas