2010-04-07 9 views
5

Próbuję dowiedzieć się, jaki jest pid procesu, który wysłał sygnał SIGCHLD, i chcę to zrobić w procedurze obsługi sygnału utworzonej dla SIGCHLD. Jak to zrobić? Próbuję:Określanie pid zakończonego procesu

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

ponieważ chcę poczekać na proces potomny, który jest spawnowany.

+0

Twoje podejście jest poprawne, powinno działać. Jakie jest Twoje pytanie? – qrdl

+0

Jak uzyskać pid procesu, który wysłał SIGCHLD? – Hristo

+2

'waitpid()' zwraca pid zakończonego potomka, jeśli wywołasz go z programu obsługi sygnału. – qrdl

Odpowiedz

7

Jeśli używasz waitpid() bardziej lub mniej, jak pokazano, będzie powiedziano PID jednego z procesów potomnych, które zginęły - zwykle będzie to jedyny proces, który zmarł, ale jeśli masz lawinę nich, możesz uzyskać jeden sygnał i wiele trupów do zebrania. Tak, użyj:

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

Można zastąpić &status z NULL jeśli nie dbają o stan wyjścia dziecka.

Powiązane problemy