Обработчик сигнала не должен sleep()
и, вероятно, не должен pause()
, хотя технически обе эти функции безопасны при асинхронном сигнале. Обработчики сигналов должны работать быстро и минимизировать или (предпочтительно) полностью избегать блокировок.
Что касается конкретных ловушек, то вы уже отметили одну: по умолчанию сигнал автоматически блокируется во время работы его обработчика. Можно установить обработчик таким образом, чтобы избежать этого, но здесь это не поможет: если вы продолжаете посылать сигналы, которые обрабатываются вашим конкретным обработчиком, то в этом обработчике всегда будет заблокирован хотя бы один поток. Если вы продолжаете отправлять их в один и тот же поток, этот поток никогда не будет разблокирован.
В целом, существует любое количество плохих взаимодействий, которые могут произойти между масками сигналов, сигнализацией и блокировками обработчиков сигналов при получении сигнала.
Более того, pause()
является довольно неспецифическим, если вы не объедините его с установкой довольно ограничительной маски сигнала (в этом случае sigsuspend()
, вероятно, является лучшим выбором). Но если вы установите ограничивающую маску сигнала, то вы можете помешать другим видам использования сигнализации.
Не «обрабатывайте» такие проблемы, кроме как избегая использования pause()
и sleep()
в ваших обработчиках сигналов.