struct sigaction
的sa_mask
字段指定在处理程序调用期间被阻止的信号。这些信号在调用处理程序之前添加到进程 block 掩码,并在处理程序完成后立即删除。如果 sa_mask
和过程信号掩码重叠怎么办?那些同时被sa_mask
和过程信号掩码屏蔽的信号是否会从过程信号掩码中移除?
最佳答案
当信号处理程序返回时,在处理信号之前有效的信号掩码将作为返回过程的一部分自动恢复。除非您使用 longjmp
或 siglongjmp
跳出信号处理程序,否则会发生这种情况,在这种情况下,是否要手动保存和恢复信号掩码取决于您。
有趣的是,如果您使用 SA_SIGINFO
标志设置三参数形式的信号处理程序,则第三个参数指向的 ucontext_t
包含一个 sigset_t uc_sigmask
反射(reflect)保存信号掩码的成员。此外,我不确定这种用法是否受到 POSIX 的认可,但在我所知道的所有真实系统中,您实际上可以在从信号处理程序返回之前修改 uc_sigmask
以设置不同的信号掩码(与恢复原始信号相反)当信号处理程序返回时。这可以被使用,例如,如果你想重新发出你刚刚处理的信号但在返回时让它被阻塞,这样它实际上会在信号再次被中断代码解除阻塞时或 时得到处理sigwaitinfo
或类似的被调用。
关于c - sigaction系统调用: what if sa_mask includes one of the blocked signals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8038502/