Как контролировать процесс жизни - PullRequest
3 голосов
/ 27 января 2011

У меня есть проблема, у меня есть контрольные исполняемые файлы, которые отслеживают несколько процессов, и если кто-то умер, он перезапустит его.На окнах мы делаем с WaitFOrMultipleObject, где дескриптор процесса передается в массив дескриптора.Если какой-либо процесс умирает, мы получаем подтверждение от WaitForMultipleObject.

Теперь мы должны реализовать это в Linux.Как мы это сделаем?Ожидание - это работа только для одного идентификатора процесса, в то время как мы должны отслеживать несколько процессов.

Ответы [ 2 ]

1 голос
/ 27 января 2011

Это одно из мест, где Unix падает - у него действительно должно быть представление о дескрипторе файла для процесса, который можно передать в select (что в Unix эквивалентно WaitForMultipleObjects); но это не так.

Вместо этого вы устанавливаете обработчик для SIGCHLD. В этом обработчике вы вызываете wait4 или waitpid (в зависимости от того, что удобнее; но не пытайтесь использовать обычный wait, вам нужен параметр options) в цикле, устанавливая флаг WNOHANG до возвращает 0. Для каждого дочернего элемента упакуйте его PID и выйдите из состояния в структуру и запишите эту структуру в канал. Прочитайте из этого канала в вашем основном цикле событий, вытащите структуры и примите соответствующие меры. НЕ ПЫТАЙТЕСЬ возродить потомков (или выделить память, или сделать что-нибудь , кроме вызовов waitpid и write) из обработчика сигнала, если только вашей программе больше нечего делать и "основной цикл" состоит вызова sigsuspend в бесконечном цикле.

1 голос
/ 27 января 2011

Похоже, вы ищете групп процессов .Вы можете waitpid(2) для группы процессов, используя -pidgroup (т.е. отрицательное значение группы pid) в качестве значения для pid в вызове или -1 для ожидания любого дочернего процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...