Вы не можете поверить, что каждый отправленный сигнал будет доставлен. Например, ядро Linux «объединяет» SIGCHLD, если процессу требуется много времени для обработки SIGCHLD из вышедшего дочернего процесса.
Чтобы ответить на другую часть вашего вопроса, сигналы «ставятся в очередь» внутри ядра, если несколько разных сигналов поступают за слишком короткий промежуток времени.
Вы должны использовать sigaction()
для настройки обработчика сигнала с sa_sigaction
членом siginfo_t
, тщательно настраивая sa_mask
член siginfo_t
аргумента. Я думаю, что это означает, по крайней мере, маскирование всех «асинхронных» сигналов. Согласно man-странице для Linux sigaction()
, вы также замаскируете обрабатываемый сигнал. Я думаю, что вы должны установить sa_flags
член SA_SIGINFO, но я не могу вспомнить, почему у меня есть это суеверие. Я полагаю, что это сделает ваш процесс обработчиком сигналов, который остается установленным без условий гонки, и тот, который не прерывается большинством других сигналов.
Напишите свою функцию обработчика сигнала очень, очень тщательно. По сути, просто установите глобальную переменную, чтобы указать, что сигнал был пойман, а остальная часть процесса должна обработать желаемое действие для этого сигнала. Таким образом, сигналы будут маскироваться в течение наименьшего количества времени.
Кроме того, вы захотите очень тщательно протестировать код обработки сигналов. Проведите небольшой тестовый процесс и отправьте как можно больше сигналов SIGUSR1 и SIGUSR2, возможно, из 2 или 3 специальных программ для отправки сигналов. Смешайте и некоторые другие сигналы, после того как вы уверены, что ваш код может обрабатывать SIGUSR1 и SIGUSR2 быстро и правильно. Приготовьтесь к трудной отладке.
Если вы используете Linux и только Linux, вы можете подумать о том, signalfd()
чтобы создать дескриптор файла, который вы можете использовать, select()
или опросить для получения этих сигналов. Использование signalfd()
может облегчить отладку.
signal(2)
настоятельно рекомендует вам избегать этой путаницы, используяsigaction(2)
вместо этого.