【问题标题】:sigaction system call: what if sa_mask includes one of the blocked signals?sigaction 系统调用:如果 sa_mask 包含阻塞信号之一怎么办?
【发布时间】:2011-11-07 15:19:16
【问题描述】:

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

【问题讨论】:

    标签: c linux signals systems-programming


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      没有。恢复原始信号掩码,即。之前被屏蔽的,以后也会被屏蔽。

      【讨论】:

        猜你喜欢
        • 2015-12-25
        • 1970-01-01
        • 2022-12-14
        • 1970-01-01
        • 2020-05-04
        • 2013-10-19
        • 2020-11-11
        • 1970-01-01
        • 2021-01-04
        相关资源
        最近更新 更多