Да, sigreturn()
действительно заставляет ядро изменить маску сигнала для вызывающего потока.
Вот как и почему:
Процесс создаеткадр стека, который выглядит точно так же, как и кадр, который ядро делает, когда обработчик сигнала только что вернулся из доставленного сигнала.
Этот кадр стека содержит исходную маску сигнала для потока, используемого для доставки сигнала, и адресгде этот поток был прерван доставкой сигнала.(При нормальной работе в текущей активной маске сигналов блокируются дополнительные сигналы; в том числе и доставляемый сигнал.)
Процесс устанавливает маску сигналов на ту, которую он предпочитает.
Процесс вызывает sigreturn()
.
Ядро проверяет кадр стека, замечает старую маску сигнала и восстанавливает ее.Он также очищает кадр стека и возвращает управление обратно в код пользовательского пространства.(Кадр стека содержал адрес следующей команды, которая должна быть выполнена.)
Этот поток продолжает выполнение по адресу, указанному в этом кадре стека, теперь со своей предпочтительной маской сигналаустановлен.
sigreturn()
не может быть заблокирован seccomp, потому что это требуется для нормальной работы.(Тем не менее, обратите внимание, что sigreturn()
вызов не требуется после доставки сигнала; в определенных пределах процесс пространства пользователя может продолжить выполнение через siglongjmp()
. siglongjmp()
не является системным вызовом, простофункция пространства пользователя. Это означает, что ядро ограничено таким поведением, если только оно не отличается от поведения POSIX.1.)
Ядро 1 не различает контекст, созданныйсам пользовательский процесс и контекст, созданный ядром в стеке процессов.Поскольку контекст содержит маску сигналов, восстановленную ядром как часть обработки sigreturn()
, sigreturn()
позволит потоку изменять свою маску сигналов.
Обратите внимание, что SIGKILL
и SIGSTOP
не являютсязатронут, потому что они являются двумя сигналами, которые применяет ядро.Все остальные сигналы следует рассматривать только как запросы и уведомления, при этом получатель всегда может их блокировать или игнорировать.
1 Если * сигнальные куки или аналогичный стек sigreturnиспользуется метод проверки кадра.