【发布时间】:2011-11-07 15:19:16
【问题描述】:
struct sigaction 的 sa_mask 字段指定在处理程序调用期间被阻止的信号。这些信号在处理程序被调用之前添加到进程块掩码,并在处理程序完成后立即删除。如果sa_mask 和进程信号掩码重叠怎么办?那些同时被sa_mask 和进程信号掩码屏蔽的信号会从进程信号掩码中移除吗?
【问题讨论】:
标签: c linux signals systems-programming
struct sigaction 的 sa_mask 字段指定在处理程序调用期间被阻止的信号。这些信号在处理程序被调用之前添加到进程块掩码,并在处理程序完成后立即删除。如果sa_mask 和进程信号掩码重叠怎么办?那些同时被sa_mask 和进程信号掩码屏蔽的信号会从进程信号掩码中移除吗?
【问题讨论】:
标签: c linux signals systems-programming
当信号处理程序返回时,在处理信号之前有效的信号掩码将作为返回过程的一部分自动恢复。除非您使用longjmp 或siglongjmp 跳出信号处理程序,否则会发生这种情况,在这种情况下,是否要手动保存和恢复信号掩码取决于您。
有趣的是,如果您使用SA_SIGINFO 标志来设置三参数形式的信号处理程序,则第三个参数指向的ucontext_t 包含一个反映已保存信号掩码的sigset_t uc_sigmask 成员。此外,我不确定 POSIX 是否认可这种用法,但在我所知道的所有实际系统上,您实际上可以在从信号处理程序返回之前修改 uc_sigmask 以设置不同的信号掩码(而不是恢复原始的)当信号处理程序返回时。例如,如果您想重新提升刚刚处理的信号但在返回时将其阻塞,以便稍后在信号再次被中断代码解除阻塞或sigwaitinfo 时实际处理它或类似的被调用。
【讨论】:
那些被 sa_mask 和进程信号掩码屏蔽的信号是否会从进程信号掩码中移除?
没有。恢复原始信号掩码,即。之前被屏蔽的,以后也会被屏蔽。
【讨论】: