sigaction系统调用:如果sa_mask包含其中一个阻塞信号怎么办?

pic*_*c11 1 c linux signals systems-programming

指定在处理程序调用期间被阻止的信号的sa_mask字段struct sigaction.这些信号在调用处理程序之前添加到进程块掩码中,并在处理程序完成后立即删除.如果sa_mask和过程信号掩码重叠怎么办?那些被sa_mask过程信号掩模掩盖的信号是否会从过程信号掩模中消除?

R..*_*R.. 6

当信号处理程序返回时,在处理信号之前生效的信号掩码将作为返回过程的一部分原子恢复.除非您使用longjmp或跳出信号处理程序,否则会发生siglongjmp这种情况,在这种情况下,您是否要手动保存和恢复信号掩码取决于您.

有趣的是,如果使用该SA_SIGINFO标志来设置一个三参数形式的信号处理程序,ucontext_t则第三个参数指向的sigset_t uc_sigmask成员包含一个反映已保存信号掩码的成员.此外,我不确定这种用法是否受到POSIX的批准,但在我所知道的所有真实世界系统中,您可以uc_sigmask在从信号处理程序返回之前实际修改以设置不同的信号掩码(而不是恢复原始信号掩码) )当信号处理程序返回时.例如,如果你想重新提升你刚处理的信号但是在返回时让它被阻挡,可以使用它,这样当信号再次被被中断的代码解除阻塞时,或者当sigwaitinfo或者类似的时候,它实际上会被处理掉.调用.