当前位置: 首页 > news >正文

操作系统信号集与信号屏蔽

信号集与信号屏蔽

什么是信号集:
  • 是一种专门用于存储多个信号的数据类型 sigset_t

  • 该类型占128字节,每个字节代表了一种信号的有或无

操作信号集的相关函数:
int sigemptyset(sigset_t *set);
功能:将信号集set中的所有信号置零 清空信号集
​
int sigfillset(sigset_t *set);
功能:把信号集set中所有信号置1 
​
int sigaddset(sigset_t *set, int signum);
功能:将信号集set中的信号signum置1
​
int sigdelset(sigset_t *set, int signum);
功能:将信号集set中的信号signum置0
​
int sigismember(const sigset_t *set, int signum);
功能:测试信号集中是否存在signum信号
返回值:存在返回1, 不存在返回0 非法信号返回-1
#include <stdio.h>
#include <signal.h>
​
int main(int argc,const char* argv[])
{sigset_t set;sigfillset(&set);sigemptyset(&set);
​sigaddset(&set,2);sigaddset(&set,7);
​for(int i=1; i<=128; i++)                                               {   printf("信号%d 状态:%d\n",i,sigismember(&set,i));}   
}
​
信号的递送与未决:
  • 当信号产生后,系统内核会在其内部维护的进程表中,给响应信号的进程设置一个对应的标志位,着整个过程称为信号的递送

  • 在信号产生到完成递送之间会存在一段时间间隔,处于这个时间间隔的信号状态是“未决”

信号屏蔽:
  • 每个进程都有用一个信号掩码(signal mask,就是一个信号集),其中存在的信号是需要被该进程屏蔽的信号

  • 让需要屏蔽的信号处于“未决状态”,当可以接收信号时,让其退出未决状态,完成递送

  • 当执行一些特殊的且不想被干扰中断的操作时,例如:更新数据库敏感操作,此时可以把信号放入信号屏蔽集中,等操作完成后,再从信号屏蔽集中删除,继续处理信号,能保证敏感操作的安全性

//  信号屏蔽集的操作函数
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
功能:修改当前进程的信号掩码(屏蔽集)
how:修改信号掩码的方式:SIG_BLOCK          将set中的信号加入到信号掩码中SIG_UNBLOCK        从信号掩码中把set中的信号删除SIG_SETMASK        把set中的信号替换掉信号掩码的所有信号
set:信号集 用于设置
oldsel:信号集 用于获取旧信号集 NULL则不获取
#include <stdio.h>    
#include <signal.h>
#include <unistd.h>
​
void sigint(int num)
{   printf("按下了Ctrl+C\n");
}
void sigrtmin(int num)
{printf("我可靠!\n");
}
​
int main(int argc,const char* argv[])
{signal(SIGINT,sigint);signal(34,sigrtmin);
​sigset_t set,old_set;sigemptyset(&set);
​//  给信号集添加信号sigaddset(&set,SIGINT);sigaddset(&set,34);//  设置信号屏蔽sigprocmask(SIG_BLOCK,&set,&old_set);printf("我是进程%u\n",getpid());sleep(15);printf("我醒了,解除屏蔽!\n");//  还原屏蔽,解除屏蔽sigprocmask(SIG_SETMASK,&old_set,NULL);for(;;);
}
​
对于可靠和不可靠信号屏蔽的区别:
  • 对于不可靠信号,通过信号屏蔽该信号后,在信号屏蔽期间,该信号产生多次,都只会被屏蔽第一个,只有第一个处于未决,剩余的都不参与排队直接忽略,当解除屏蔽后,只会有第一个不可靠信号被完成递送

  • 相反,对于所有在屏蔽期间产生的可靠信号,都会排队变成未决,当屏蔽接触后,会按照次序全部完成递送

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 社交工程攻击:心理操纵的艺术与防范策略
  • Nginx 服务器配置 SSL(HTTPS)的教程
  • 【langchain学习】从零开始掌握 JSONLoader:轻松解析复杂 JSON 数据
  • 【数据结构】五、树:7.哈夫曼树、哈夫曼编码
  • 物联网井盖-智能井盖-旭华智能
  • 【python】在Python中操作MongoDB的详细用法教程与实战案例分享
  • 北斗三号5G遥测终端机系统在水库大坝安全监测应用
  • 在 MySQL 中查找最小的缺失 ID
  • webrtc一对一视频通话功能实现
  • centos7 服务器搭建
  • 深度学习------------池化层
  • vue3 ts vite开发bug记录(类型转换)
  • 如何获取能直接在浏览器打开的播放地址?
  • C语言 --- 枚举、位运算
  • 电机学习-基础知识
  • 【mysql】环境安装、服务启动、密码设置
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • Brief introduction of how to 'Call, Apply and Bind'
  • css布局,左右固定中间自适应实现
  • input的行数自动增减
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Javascript弹出层-初探
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • vuex 笔记整理
  • vue的全局变量和全局拦截请求器
  • 从零开始的无人驾驶 1
  • 后端_MYSQL
  • 类orAPI - 收藏集 - 掘金
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 思维导图—你不知道的JavaScript中卷
  • 移动端解决方案学习记录
  • 异步
  • Hibernate主键生成策略及选择
  • 阿里云移动端播放器高级功能介绍
  • 积累各种好的链接
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​如何在iOS手机上查看应用日志
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #define
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (ros//EnvironmentVariables)ros环境变量
  • (附源码)计算机毕业设计ssm电影分享网站
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (五)关系数据库标准语言SQL
  • ****Linux下Mysql的安装和配置
  • .NET Core 中的路径问题
  • .NET gRPC 和RESTful简单对比
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net后端程序发布到nignx上,通过nginx访问