2010-04-07 14 views
5

Sto cercando di capire qual è il pid di un processo che ha inviato il segnale SIGCHLD, e voglio farlo in un gestore di segnale che ho creato per SIGCHLD. Come lo farei? Sto cercando:Determinare il pid del processo terminato

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

perché voglio attendere per qualsiasi processo figlio che viene generato.

+0

Il tuo approccio è corretto, dovrebbe funzionare. Qual'è la tua domanda? – qrdl

+0

come ottengo il pid del processo che ha inviato SIGCHLD? – Hristo

+2

'waitpid()' restituisce il pid del figlio terminato, se lo si chiama dal gestore del segnale. – qrdl

risposta

7

Se si utilizza waitpid() più o meno come mostrato, verrà indicato il PID di uno dei processi figlio che è morto, in genere quello sarà l'unico processo che è morto, ma se si ottiene una raffica di essi, potresti ricevere un segnale e molti cadaveri da raccogliere. Quindi, utilizzare:

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

È possibile sostituire &status con NULL se non si preoccupano lo stato di uscita del bambino.