У меня есть проблема в теме процессов posix, и я не могу обойтись.
У меня есть процесс, который разветвляется на несколько дочерних элементов (дерево процессов может быть сложным, а не только одного уровня).Он также отслеживает PID активных детей.В какой-то момент родитель получает сигнал (скажем, SIGINT).
В обработчике сигналов для SIGINT он перебирает список дочерних процессов и отправляет им тот же сигнал, чтобы предотвратить появление зомби.Теперь проблема в том, что
- , если родительский объект не выполняет waitpid () для остановки дочернего элемента, кажется, что сигнал никогда не отправляется (зомби продолжают работать)
- , еслиparent ожидает после каждого kill (), отправленного потомку, он просто висит там, и потомок, кажется, игнорирует сигнал
Родитель и потомок имеют одинаковый обработчик сигнала, который устанавливается перед разветвлением.Вот псевдокод.
signal_handler( signal )
foreach child in children
kill( child, signal )
waitpid( child, status )
// Releasing system resources, etc.
clean_up()
// Restore signal handlers.
set_signal_handlers_to_default()
// Send back the expected "I exited after XY signal" to the parent by
// executing the default signal handler again.
kill( getpid(), signal )
С этой реализацией выполнение останавливается на waitpid.Если я уберу waitpid, дети продолжат работать.
Я предполагаю, что если обработчик сигналов не завершится, сигналы, отправленные с него, не будут отправлены детям.Но почему они не отправляются, если я опускаю ожидание?
Заранее большое спасибо!