Формальная функция обработчика сигнала должна делать как можно меньше.Стандарт C говорит, что он может записывать в переменную volatile sig_atomic_t
или вызывать abort()
или _Exit()
(или, с ограничениями, signal()
).POSIX позволяет многому случиться, и вы, вероятно, работаете над Linux (хотя вы этого не сказали).Итак, ваш обработчик сигнала изменит значение переменной sig_atomic_t
с 0 на 1, чтобы указать, что сигнал произошел.
Итак, ваши дочерние процессы будут зацикливаться.Как часть условия цикла, вы должны проверить переменную sig_atomic_t
, чтобы увидеть, должен ли дочерний элемент завершаться.Когда он обнаруживает, что произошел сигнал, он прекращает цикл, открывает файл журнала для добавления, записывает свою информацию в этот файл и завершает работу.Вы можете проверить переменную sig_atomic_t
в других точках обработки, кроме только условия основного цикла;это ваше решение.
Обратите внимание, что вы должны использовать sigaction()
вместо signal()
для управления обработкой сигнала, и вам следует блокировать прерывания при обработке сигнала.
Итак, подведем итог:
- Ваш обработчик сигнала делает как можно меньше.
- Ваш код обнаруживает в главном цикле, когда обработчик сигнала был вызван, и организует выход.
- ВашКод также может определять, когда обработчик сигнала вызывался в других удобных точках.
- Вы можете вызвать функцию для ведения журнала и выхода.