системный вызов sigaction: что, если sa_mask включает один из заблокированных сигналов?

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


person pic11    schedule 07.11.2011    source источник


Ответы (2)


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

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

person R.. GitHub STOP HELPING ICE    schedule 07.11.2011

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

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

person jpalecek    schedule 07.11.2011