sa_mask
的{{1}}字段指定在处理程序调用期间被阻止的信号。这些信号在调用处理程序之前添加到进程块掩码中,并在处理程序完成后立即删除。如果struct sigaction
和过程信号掩码重叠怎么办?那些被sa_mask
和过程信号掩码屏蔽的信号是否会从过程信号掩码中删除?
答案 0 :(得分:6)
当信号处理程序返回时,处理信号之前生效的信号掩码将作为返回过程的一部分原子恢复。除非您使用longjmp
或siglongjmp
跳出信号处理程序,否则会发生这种情况,在这种情况下,您是否要手动保存和恢复信号掩码取决于您。
有趣的是,如果使用SA_SIGINFO
标志来设置三参数形式的信号处理程序,则第三个参数指向的ucontext_t
包含一个sigset_t uc_sigmask
成员反映保存的信号掩码。此外,我不确定这个用法是否受到POSIX的批准,但在我所知道的所有真实系统中,你可以在从信号处理程序返回之前修改uc_sigmask
以设置不同的信号掩码(相反)在信号处理程序返回时恢复原始的。例如,如果你想重新提升你刚才处理的信号但是在返回时让它被阻塞,可以使用它,以便在信号再次被被中断的代码解除阻塞时或{{1调用类似的东西。
答案 1 :(得分:2)
那些被sa_mask和过程信号掩码屏蔽的信号是否会从过程信号掩码中删除?
没有。恢复原始信号掩码,即。之前阻止的内容会在之后被阻止。