Я работаю над серверным кодом, который использует fork ()
и exec для создания дочерних процессов. PID дочернего элемента регистрируется при успешном завершении fork ()
и очищается при обнаружении сигнала CHILD
.
Если серверу необходимо остановиться, все программы будут уничтожены, в конечном итоге с сигналом KILL. Теперь это работает посредством перебора всех зарегистрированных PID и ожидания, пока обработчик сигнала CHILD удалит эти PID. Это не удастся, если дочерняя программа не завершилась должным образом. Поэтому я хочу использовать kill
в сочетании с waitpid
, чтобы гарантировать, что список PID будет очищен и зарегистрирован, а в противном случае выполнить некоторые другие действия.
Рассмотрим следующий пример кода:
kill(pid, SIGKILL);
waitpid(pid, NULL, WNOHANG);
Выдержка из waitpid (2)
:
waitpid (): в случае успеха возвращает идентификатор процесса дочернего процесса, состояние которого изменилось; если указан WNOHANG и один или несколько дочерних (детей) указанный pid существует, но еще не изменил состояние, тогда возвращается 0. В случае ошибки возвращается -1.
Всегда ли процесс, заданный параметром pid
, завершается до того, как сработает следующая функция? Будет ли waitpid
всегда возвращать -1
в приведенном выше случае?