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