Поле sa_mask поля struct sigaction указывает сигналы, которые блокируются во время вызова обработчика. Эти сигналы добавляются в маску блока процесса непосредственно перед вызовом обработчика и удаляются сразу после его завершения. Что делать, если sa_mask и маска сигнала процесса перекрываются? Будут ли те сигналы, которые маскируются как sa_mask, так и маской сигналов процесса, будут удалены из маски сигналов процесса?
системный вызов sigaction: что, если sa_mask включает один из заблокированных сигналов?
Ответы (2)
Когда обработчик сигнала возвращается, маска сигнала, которая действовала до обработки сигнала, восстанавливается атомарно как часть процесса возврата. Это произойдет, если вы не выйдете из обработчика сигнала с помощью longjmp или siglongjmp, и в этом случае вам решать, хотите ли вы вручную сохранить и восстановить маску сигнала.
Интересно отметить, что если вы используете флаг SA_SIGINFO для настройки обработчика сигнала с тремя аргументами, ucontext_t, на который указывает третий аргумент, содержит член sigset_t uc_sigmask, отражающий сохраненную маску сигнала. Кроме того, я не уверен, санкционировано ли такое использование POSIX, но во всех известных мне реальных системах вы действительно можете изменить uc_sigmask перед возвратом из обработчика сигнала, чтобы установить другую маску сигнала (в отличие от восстановления исходной one) при возврате обработчика сигнала. Это можно использовать, например, если вы хотите повторно поднять сигнал, который вы только что обработали, но оставить его заблокированным при возврате, чтобы он фактически обрабатывался позже, когда сигнал снова разблокируется прерванным кодом или когда sigwaitinfo или подобное называется.
Будут ли те сигналы, которые маскируются как sa_mask, так и маской сигналов процесса, будут удалены из маски сигналов процесса?
Нет. Восстанавливается исходная маска сигнала, т.е. то, что было заблокировано до этого, будет заблокировано после.