2010-04-07 12 views
5

Ich versuche herauszufinden, was die PID eines Prozesses ist, der das SIGCHLD-Signal gesendet hat, und ich möchte dies in einem Signalhandler tun, den ich für SIGCHLD erstellt habe. Wie würde ich das tun? Ich versuche:Ermitteln PID des beendeten Prozesses

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

, weil ich auf jeden Kindprozess warten möchte, der hervorgebracht wird.

+0

Ihr Ansatz ist richtig, es sollte funktionieren. Was ist deine Frage? – qrdl

+0

Wie bekomme ich die PID des Prozesses, der SIGCHLD gesendet hat? – Hristo

+2

'waitpid()' gibt die PID des terminierten Kinds zurück, wenn Sie es von Ihrem Signalhandler aus aufrufen. – qrdl

Antwort

7

Wenn Sie mehr oder weniger wie gezeigt verwenden, werden Sie die PID eines der Kind Prozesse erzählt, die gestorben ist - in der Regel wird das der einzige Prozess sein, der gestorben ist, aber wenn Sie eine Flut von ihnen bekommen, Sie könnten ein Signal bekommen und viele Leichen sammeln. So verwenden:

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

Sie &status mit NULL ersetzen können, wenn Sie nicht über die Exit-Status des Kindes kümmern.

Verwandte Themen