Чтобы ответить на вторую часть вашего вопроса, "правда ли, что обработчики сигналов должны выполнять как можно меньше работы?" ответ - да, потому что существует очень минимальный набор функций, которые «безопасны для асинхронных сигналов» и поэтому могут вызываться из обработчиков сигналов. Асинхронный сигнал безопасности является своего рода расширенной формой повторного входа. Если foo()
безопасен для асинхронного сигнала, это означает, что безопасно вызывать foo()
в обработчике сигнала, даже если foo()
уже выполнялся, когда сигнал был поднят.
Вы можете получить полный список функций безопасности асинхронных сигналов, посмотрев справочную страницу раздела 7 для signal
(man 7 signal
). Вызов любой функции, кроме одной из них, из обработчика сигнала, прямо или косвенно, вызывает неопределенное поведение.
Подход "запись байта в канал" - отличный способ справиться с сигналами, не ограничиваясь асинхронными безопасными функциями сигналов, особенно если ваша программа уже ориентирована на цикл select
.