Уведомление родительскому процессу - PullRequest
1 голос
/ 12 марта 2011

При использовании системного вызова fork я много раз видел, как родитель вызывает waitpid, чтобы дочерний процесс мог завершиться.

Мой вопрос заключается в том, отправляет ли ребенок уведомление родительскому предшественнику. Без использования какого-либо общего ресурса, как родитель может определить, что chils был завершен?

Ответы [ 3 ]

5 голосов
/ 12 марта 2011

ОС отправляет SIGCHLD родителю при выходе ребенка. Вы можете выбрать waitpid(), используя WNOHANG, или просто проверить с помощью wait() после получения SIGCHLD. Дочернему процессу не нужно ничего делать конкретно, все это управляется ОС.

1 голос
/ 12 марта 2011

В операционной системе Linux у каждого ребенка есть какой-то родитель, и даже если родитель умирает раньше, чем ребенок, он наследуется процессом init (PID: 1).Это сделано для того, чтобы не было никакого процесса-зомби (запись процесса есть в таблице процессов, но процесс фактически уже умер), который занимает место в памяти без использования.

Ядро следит за всеми процессами, которые были остановлены либо из-за их полного выполнения, либо по какой-то другой причине (например, недопустимый доступ к памяти), и сохраняет некоторую информацию, например, состояние выхода ребенка.Когда ребенок завершает работу, SIGCHLD сигнал отправляется родителю.По умолчанию сигнал просто игнорируется.Однако обычно системный вызов wait() реализован в обработчике для SIGCHLD, так что родитель может действовать в зависимости от состояния выхода ребенка.

0 голосов
/ 14 марта 2011

В дополнение к получению SIGCHLD в качестве упомянутого от Эрика , вы можете опрашивать ребенка на предмет интересующих событий, используя WNOHANG.Вот пример:

pid_t pid = fork();
if (pid) {
    while (1) {
        int status;
        int waitpid(pid, &status, WNOHANG);
        if (pid == waitpid && WIFEXITED(status))
            break;            
        // do other stuff
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...