Что произойдет, если во время обработки сигнала в UNIX тот же сигнал будет отправлен в программу? - PullRequest
9 голосов
/ 27 июня 2010

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

Пока мы задаемся этим вопросом, правда ли, что обработчики сигналов должны выполнять как можно меньше работы?

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

Спасибо, Бода Кидо.

Ответы [ 2 ]

8 голосов
/ 27 июня 2010

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

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

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

7 голосов
/ 27 июня 2010

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

...