2010-11-08 14 views
5

Pregunto por linux con glibc reciente.Linux: detectar en tiempo de ejecución que un proceso tiene múltiples hilos

¿Hay alguna forma de detectar ese proceso en 1 hilo o varios hilos?

Los subprocesos se pueden crear mediante pthread, o clon desnudo(), así que necesito algo bastante universal.

UPD: Quiero detectar los hilos del proceso actual desde él mismo.

+0

¿Dentro de su propio programa o externamente? – Duck

+0

Duck, dentro de mi programa. – osgx

+0

Tengo que preguntar: ¿por qué ya no lo sabes? ¿Hay una biblioteca o tal apertura bajo las sábanas? – Duck

Respuesta

11

Compruebe si el directorio/proc/YOUR_PID/task/contiene un solo subdirectorio. Si tiene más de un hilo en proceso, habrá varios subdires.

El recuento de enlaces permanentes se puede utilizar para contar los subdirectorios. Esta función devuelve el número actual de las discusiones:

#include <sys/stat.h> 

int n_threads(void) 
{ 
    struct stat task_stat; 

    if (stat("/proc/self/task", &task_stat)) 
     return -1; 

    return task_stat.st_nlink - 2; 
} 
+0

Hmm ... Sí. Hay hilos para algunos procesos. Pero para obtener información de/proc necesito muchas llamadas de sistema: opendir/readdir. ¿Hay alguna manera más fácil? – osgx

+1

@osgx: Puede hacerlo con un syscall - simplemente 'stat ("/proc/self/task ")' y verifique si 'st_nlink> 3'. – caf

+0

caf, Gracias, pero, ¿los procfs mantienen el conteo de enlaces inodos para los directorios? ¿Marcas este método? – osgx

0

supongo que se podría ejecutar 'ps' (a través de popen() o similar) y analizar su salida, y ver cuántas veces tu ID de proceso (tal como lo devuelve getpid()) aparece en la salida. Puede haber una mejor manera, pero eso es lo primero que viene a la mente.

+0

NO, por favor, no hay ningún subproceso que comience :). Es muy lento, y necesito una forma rápida, como 1 syscall o alguna lectura de indicador, etc. – osgx

0

/proc es la forma estándar de hacer esto en Linux. Herramientas como 'ps' funcionan a través de/proc. En Linux 2.6, puede encontrar el número de subprocesos en/proc/self/stat, pero eso no es retrocompatible.

0

La respuesta de Victor es ciertamente la más rápida, aunque es posible que desee considerar el uso de la biblioteca ps en su lugar.

La denominación de Ubuntu es libprocps3-dev por lo que utilizar instalarlo usando:

sudo apt-get install libprocps3-dev 

Las cabeceras se encuentran en /usr/include/proc.

Tenga en cuenta que la biblioteca funciona leyendo/proc. Por lo tanto, es lo mismo que leer directamente los archivos de interés, solo conocerá las diferencias entre las distintas versiones y se encargará de eso bajo sus propios ojos.

Ver http://procps.sourceforge.net/index.html para más detalles.

+0

¿Cuántas llamadas al sistema harán los procps para responder a la pregunta "el proceso consiste en 1 hilo o más de 1 hilo"? – osgx

+1

En la respuesta principal, veo que muchas personas preguntan sobre el problema de compatibilidad. Procps es definitivamente lento, pero debería funcionar de forma transparente en las versiones más nuevas y más antiguas de Linux. Depende de si necesita velocidad o compatibilidad a largo plazo. –

Cuestiones relacionadas