signals - sigprocmask 后的信号传递
问题描述
我的印象是,使用sigprocmask()
解除阻塞信号会导致待处理的阻塞信号被传递给处理。
sigprocmask()
在用于解除阻塞信号的特定情况下,如果存在SIGUSR1
已解除阻塞的挂起信号(例如 ),是否会通过调用解除阻塞不同信号SIGUSR1
的调用将信号传递给进程,sigprocmask()
同时保持SIGUSR1
解除阻塞?
解决方案
要彻底理解它,我们需要了解信号是如何在 linux 中生成和传递的。
当内核收到任何信号请求时,它会为进程设置信号挂起标志,前提是信号没有被阻塞。现在,在返回用户模式之前,内核检查是否存在用于进程的非阻塞挂起信号。如果是,那么内核更愿意在返回用户模式之前传递该信号。现在来回答你的问题:
如果有一个挂起的信号(比如 SIGUSR1)已经被解除阻塞,
我假设信号(SIGUSR1)首先被阻塞,然后被解除阻塞。在这种情况下,当用户尝试解除对信号的阻塞时,将在用户进程以用户模式恢复之前传递信号。例如。如果sigprocmask()
用于解除阻塞信号,则信号将在sigprocmask()
返回之前传递。
信号 SIGUSR1 是否会通过调用 sigprocmask() 来传递给进程,从而在保持 SIGUSR1 畅通的同时解除对不同信号的阻塞?
如果多个挂起的信号被解除阻塞并准备好传递,那么内核会选择具有最低信号数的信号(当然,同步信号比异步信号具有更高的优先级)首先传递。
推荐阅读
- node.js - 部署 AWS Lambda S3 教程代码时出错
- google-cloud-platform - 如何查看或列出数据流作业 VPC/网络?
- java - Android资源链接失败AAPT:错误:写入失败
- linux - ARM Beaglebone black 的交叉编译器错误
- flutter - 使用 http 请求获取嵌套 Json 返回 null
- mysql - 与node js应用程序连接时如何解决mysql错误号1064?
- kotlin - 相同类的 Kotlin 密封类
- java - Java 运行时出现终端错误,无法识别类文件版本 > 52.0
- docker - 使用 aws-sam-cli 时出错 | 未能在公司代理后面拉取 docker 映像
- html - 创建动态网格时防止 div 增长/拉伸