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

时间:2011-11-07 15:19:16

标签: c linux signals systems-programming

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

  

那些被sa_mask和过程信号掩码屏蔽的信号是否会从过程信号掩码中删除?

没有。恢复原始信号掩码,即。之前阻止的内容会在之后被阻止。