在man 2 seccompSECCOMP_SET_MODE_STRICT
部分中,据说:
请注意,虽然调用线程不能再调用 sigprocmask(2),但它可以使用 sigreturn(2) 来阻塞除 SIGKILL 和 SIGSTOP 之外的所有信号。
我无法弄清楚如何做到这一点。sigreturn
是syscall
那个
这个 sigreturn() 调用撤消了所有已完成的操作——更改进程的信号掩码、切换信号堆栈(参见 sigaltstack(2))——以便调用信号处理程序。
进一步来说:
使用之前保存在用户空间堆栈中的信息
sigreturn() 恢复进程的信号掩码、切换堆栈并恢复进程的上下文(处理器标志和寄存器,包括堆栈指针和指令指针),
信息通过以下方式存储:
保存的进程上下文信息放置在 ucontext_t 结构中(请参阅 参考资料)。该结构在信号处理程序中是可见的,作为通过 sigaction(2) 使用 SA_SIGINFO 标志建立的处理程序的第三个参数。
我认为这是不可能的,因为以下两个原因:
由于
TERM
信号的动作不需要返回到用户空间,所以没有办法dying
通过使用atexit
或类似的东西来阻止。ucontext_t
2.虽然可以用man 2 getcontext或man 3 makecontext填写 a ,但这无助于进程阻止信号,因为所有用于安装处理程序和屏蔽信号的系统调用都被禁用(除非sigreturn
使用 siganl 掩码东西本身)。