Доставка Сигнала после сигпрокмаски

У меня сложилось впечатление, что с помощью sigprocmask() разблокирование сигнала приведет к обработке ожидающего заблокированного сигнала.

В конкретном случае, когда sigprocmask() используется для разблокировки сигналов, если есть ожидающий сигнал (скажем, SIGUSR1), который уже разблокирован, будет сигнал SIGUSR1 быть доставлены в процесс с вызовом sigprocmask() который разблокирует другой сигнал, сохраняя при этом SIGUSR1 разблокирован?

1 ответ

Решение

Чтобы понять это полностью, нам нужно понять, как сигнал генерируется и доставляется в Linux.

Когда ядро ​​получает любой сигнал запроса, оно устанавливает флаг ожидания сигнала для процесса, если сигнал не заблокирован. Теперь перед возвратом в режим пользователя ядро ​​проверяет, присутствуют ли неблокированные ожидающие сигналы для процесса или нет. Если да, то ядро ​​предпочитает доставлять этот сигнал, прежде чем вернуться в режим пользователя. Теперь перейдем к вашему вопросу:

если есть ожидающий сигнал (скажем, SIGUSR1), который уже разблокирован,

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

Будет ли сигнал SIGUSR1 доставлен процессу с помощью вызова sigprocmask(), который разблокирует другой сигнал, сохраняя при этом SIGUSR1 разблокированным?

Если несколько ожидающих сигналов разблокированы и готовы к доставке, то ядро ​​выбирает сигнал, который имеет наименьший номер сигнала (конечно, синхронные сигналы имеют более высокий приоритет по сравнению с асинхронным сигналом), чтобы доставить первым.

Другие вопросы по тегам