Что происходит, если во время обработки сигнала в UNIX, тот же сигнал отправляется в программу?

Какие-либо идеи об этом? Есть ли некоторая очередь сигнала, или это становится отброшенным?

В то время как мы в этом вопросе, действительно ли это верно, что обработчики сигналов должны сделать максимально минимальную работу?

Я считал где-нибудь, что обработчик сигналов должен использовать канал и просто записать один байт в него, указав на то, что должна сделать программа. Затем где-то в другом месте программа периодически проверяет канал и диспетчеризирует на основе байта в нем. (Я, возможно, неправильно понял его),

Спасибо, Boda Cydo.

9
задан bodacydo 27 June 2010 в 14:23
поделиться

2 ответа

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

Вы можете получить полный список функций безопасности асинхронных сигналов, просмотрев справочную страницу раздела 7 для signal ( man 7 signal ). Вызов любой функции, кроме одной из них, из обработчика сигнала, прямо или косвенно, вызывает неопределенное поведение.

Подход «записать байт в конвейер» - отличный способ работать с сигналами, не ограничиваясь функциями безопасности асинхронных сигналов, особенно если ваша программа уже ориентирована на цикл select .

8
ответ дан 4 December 2019 в 13:45
поделиться

Чтобы ответить на первую часть вашего вопроса, по умолчанию используется следующее: Если это тот же сигнал, что и тот, который обрабатывается в данный момент, новый сигнал блокируется (ставится в очередь) и передается, когда обработчик возвращается. Если поступает другой сигнал, вызывается обработчик нового сигнала. c.f. руководство по glibc.

7
ответ дан 4 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: