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