Доставка Сигнала после сигпрокмаски
У меня сложилось впечатление, что с помощью sigprocmask()
разблокирование сигнала приведет к обработке ожидающего заблокированного сигнала.
В конкретном случае, когда sigprocmask()
используется для разблокировки сигналов, если есть ожидающий сигнал (скажем, SIGUSR1
), который уже разблокирован, будет сигнал SIGUSR1
быть доставлены в процесс с вызовом sigprocmask()
который разблокирует другой сигнал, сохраняя при этом SIGUSR1
разблокирован?
1 ответ
Чтобы понять это полностью, нам нужно понять, как сигнал генерируется и доставляется в Linux.
Когда ядро получает любой сигнал запроса, оно устанавливает флаг ожидания сигнала для процесса, если сигнал не заблокирован. Теперь перед возвратом в режим пользователя ядро проверяет, присутствуют ли неблокированные ожидающие сигналы для процесса или нет. Если да, то ядро предпочитает доставлять этот сигнал, прежде чем вернуться в режим пользователя. Теперь перейдем к вашему вопросу:
если есть ожидающий сигнал (скажем, SIGUSR1), который уже разблокирован,
Я предполагаю, что сигнал (SIGUSR1) сначала блокируется, а затем разблокируется. В этом случае, когда пользователь попытался разблокировать сигнал, сигнал будет доставлен до того, как пользовательский процесс возобновится в пользовательском режиме. Например если sigprocmask()
используется для разблокировки сигнала, тогда сигнал будет доставлен еще до sigprocmask()
возвращается.
Будет ли сигнал SIGUSR1 доставлен процессу с помощью вызова sigprocmask(), который разблокирует другой сигнал, сохраняя при этом SIGUSR1 разблокированным?
Если несколько ожидающих сигналов разблокированы и готовы к доставке, то ядро выбирает сигнал, который имеет наименьший номер сигнала (конечно, синхронные сигналы имеют более высокий приоритет по сравнению с асинхронным сигналом), чтобы доставить первым.