Системный вызов sigaction: что если sa_mask включает один из заблокированных сигналов? - PullRequest
1 голос
/ 07 ноября 2011

Поле sa_mask struct sigaction указывает сигналы, которые блокируются во время вызова обработчика.Эти сигналы добавляются в маску блока процесса непосредственно перед вызовом обработчика и удаляются сразу после его завершения.Что если sa_mask и маска сигнала процесса перекрываются?Будут ли те сигналы, которые замаскированы как sa_mask, так и маской сигналов процесса, удалены из маски сигналов процесса?

Ответы [ 2 ]

6 голосов
/ 07 ноября 2011

Когда обработчик сигнала возвращается, маска сигнала, которая действовала до обработки сигнала, восстанавливается атомарно как часть процесса возврата. Это произойдет, если вы не выпрыгнете из обработчика сигнала с помощью longjmp или siglongjmp, и в этом случае вам решать, хотите ли вы вручную сохранить и восстановить маску сигнала.

Интересно отметить, что если вы используете флаг SA_SIGINFO для настройки обработчика сигнала в форме трех аргументов, ucontext_t, на который указывает третий аргумент, содержит элемент sigset_t uc_sigmask, отражающий сохраненную маску сигнала. Кроме того, я не уверен, санкционировано ли это использование POSIX, но на всех известных мне реальных системах вы можете изменить uc_sigmask перед возвратом из обработчика сигнала, чтобы установить другую маску сигнала (в отличие от восстановления исходный), когда обработчик сигнала возвращается. Это может быть использовано, например, если вы хотите повторно поднять сигнал, который вы только что обработали, но оставить его заблокированным при возврате, чтобы он действительно обрабатывался позже, когда сигнал снова разблокируется прерванным кодом или когда sigwaitinfo или аналог называется.

2 голосов
/ 07 ноября 2011

Будут ли те сигналы, которые маскируются как sa_mask, так и маской сигналов процесса, будут удалены из маски сигналов процесса?

Нет. Исходная сигнальная маска восстанавливается, т.е. то, что было заблокировано до, будет заблокировано после.

...