2010-04-07 11 views
5

Я пытаюсь выяснить, что pid представляет собой процесс, который отправил сигнал SIGCHLD, и я хочу сделать это в обработчике сигналов, который я создал для SIGCHLD. Как мне это сделать? Я пытаюсь:Определить pid завершенного процесса

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

потому что я хочу дождаться любого дочернего процесса, который порожден.

+0

Ваш подход правильный, он должен работать. Каков твой вопрос? – qrdl

+0

Как получить pid процесса, который отправил SIGCHLD? – Hristo

+2

'waitpid()' возвращает pid завершенного дочернего элемента, если вы вызываете его из обработчика сигнала. – qrdl

ответ

7

Если вы используете waitpid() более или менее, как показано на рисунке, вам сообщается PID одного из дочерних процессов, который умер - обычно это единственный процесс, который умер, но если вы получите шквал их, вы можете получить один сигнал и множество трупов для сбора. Таким образом, использование:

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

Вы можете заменить &status с NULL, если вы не заботитесь о состоянии выхода ребенка.

Смежные вопросы