Доставка Сигнала после сигпрокмаски - PullRequest
0 голосов
/ 06 мая 2018

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

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

1 Ответ

0 голосов
/ 07 мая 2018

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

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

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

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

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

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

...