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