c - sigaction系统调用: what if sa_mask includes one of the blocked signals?

标签 c linux signals systems-programming

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

最佳答案

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

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

关于c - sigaction系统调用: what if sa_mask includes one of the blocked signals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8038502/

相关文章:

c++ - qt 信号导致连接段错误

c - 将结构数组传递给函数

python - 如何将Python数字转换为1字节C类型?

c - 查询将用于连接到某个目标的接口(interface)的 IP

linux - ld 在将 .asm 文件汇编和链接到 64 位可执行文件后找不到符号 _start 错误

linux - shell 中的 "invalid arithmetic operator"

c++ - SIGALRM 超时——它如何影响现有操作?

c++ - 使用CL_MEM_USE_HOST_PTR时是否需要入队读/写?

c - 处理坏文件描述符错误的方法

c++ - 使用 boost::signals2 处理许多信号/槽的连接/断开