2010-04-07 22 views
5

Estoy tratando de averiguar qué es el pid de un proceso que envió la señal SIGCHLD, y quiero hacer esto en un controlador de señal que creé para SIGCHLD. ¿Cómo haría esto? Estoy intentando:Determine pid de proceso terminado

int pid = waitpid(-1, NULL, WNOHANG); 

porque quiero esperar a cualquier proceso secundario que se genera.

+0

Su enfoque es correcto, debería funcionar. ¿Cuál es tu pregunta? – qrdl

+0

¿cómo obtengo el pid del proceso que envió SIGCHLD? – Hristo

+2

'waitpid()' devuelve el pid del hijo terminado, si lo llama desde su controlador de señal. – qrdl

Respuesta

7

Si usa waitpid() más o menos como se muestra, se le informará el PID de uno de los procesos hijo que ha muerto; por lo general, ese será el único proceso que ha muerto, pero si recibe una ráfaga de ellos, es posible que obtenga una señal y muchos cadáveres para recoger. Por lo tanto, utiliza:

void sigchld_handler(int signum) 
{ 
    pid_t pid; 
    int status; 
    while ((pid = waitpid(-1, &status, WNOHANG)) != -1) 
    { 
     unregister_child(pid, status); // Or whatever you need to do with the PID 
    } 
} 

Puede reemplazar &status con NULL si no se preocupan por el estado de salida del niño.

Cuestiones relacionadas