嵌入式Linux系统编程 — 6.4 信号集

目录​​​​​​​

1 信号集概念

2 sigemptyset、sigfillset初始化信号集

3  sigaddset、sigdelset向信号集中添加/删除信号

4 sigismember函数测试信号是否在信号集中


1 信号集概念

在Linux系统中,信号集(signal set)用于表示一组信号的集合,信号集的使用主要涉及到信号的阻塞与未决状态的管理。很多系统调用都使用到了信号集这种数据类型来作为参数传递,譬如 sigaction()函数、 sigprocmask()函数、 sigpending()函数等。

信号集其实就是 sigset_t 类型数据结构:

# define _SIGSET_NWORDS (1024 / (8 * sizeof (unsigned long int)))
typedef struct
{unsigned long int __val[_SIGSET_NWORDS];
} sigset_t;

宏定义 _SIGSET_NWORDS:

  • 这个宏定义计算了需要多少个unsigned long int来表示所有的信号。由于Linux系统支持的信号数量最多为1024(因系统而异),每个unsigned long int的大小是其位数除以8(即字节数),再乘以sizeof(unsigned long int)得到每个unsigned long int的位数。因此,(1024 / (8 * sizeof (unsigned long int)))计算了总共需要多少个unsigned long int来存储1024个信号的位图。

sigset_t 结构体:

  • sigset_t是一个结构体,它包含一个数组类型是unsigned long int__val的数组,长度由_SIGSET_NWORDS宏定义决定。

2 sigemptyset、sigfillset初始化信号集

sigemptyset()和 sigfillset()用于初始化信号集。 sigemptyset()初始化信号集,使其不包含任何信号;而sigfillset()函数初始化信号集,使其包含所有信号(包括所有实时信号),函数原型如下:

#include <signal.h>int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
  • set: 指向需要进行初始化的信号集变量。
  • 返回值: 成功返回 0;失败将返回-1,并设置 errno。

这两个函数通常与 sigaction(), sigpending(), sigprocmask() 等函数一起使用,以控制进程对信号的响应和处理。例如,使用 sigfillset() 可以创建一个包含所有信号的信号集,然后通过 sigprocmask() 来阻塞或允许这些信号。

下面是一个简单的使用 sigemptyset()sigfillset() 的示例:

#include <stdio.h>
#include <signal.h>
#include <errno.h>
#include <string.h>int main() 
{sigset_t set, oldset, emptyset;// 填充信号集if (sigfillset(&set) == -1) {perror("Error in sigfillset");return 1;}// 清空信号集if (sigemptyset(&emptyset) == -1) {perror("Error in sigemptyset");return 1;}// 阻塞所有信号if (sigprocmask(SIG_BLOCK, &set, &oldset) == -1) {perror("Error in sigprocmask - SIG_BLOCK");return 1;}// 打印信号集状态printf("Current signal set is blocked.\n");// 恢复信号屏蔽if (sigprocmask(SIG_SETMASK, &oldset, NULL) == -1) {perror("Error in sigprocmask - SIG_SETMASK");return 1;}// 打印信号集状态printf("Original signal set restored.\n");return 0;
}

运行结果如下:

3  sigaddset、sigdelset向信号集中添加/删除信号

sigaddset()sigdelset() 也是用于操作信号集的函数,允许向信号集中添加或删除特定的信号,函数原型如下:

#include <signal.h>int sigaddset(sigset_t *set, int signum);
int sigdelset(sigset_t *set, int signum);
  • set: 指向信号集。
  • signum: 需要添加/删除的信号。
  • 返回值: 成功返回 0;失败将返回-1,并设置 errno。

下面是一个简单的示例,演示如何使用 sigaddset()sigdelset()

#include <stdio.h>
#include <signal.h>
#include <errno.h>int main() 
{sigset_t set;// 初始化信号集为空if (sigemptyset(&set) == -1) {perror("sigemptyset");return 1;}// 添加SIGINT(通常用于处理Ctrl+C中断)到信号集if (sigaddset(&set, SIGINT) == -1) {perror("sigaddset");return 1;}// 打印信号集状态,确认SIGINT已添加if (sigismember(&set, SIGINT)) {printf("SIGINT is in the signal set.\n");}// 从信号集中删除SIGINTif (sigdelset(&set, SIGINT) == -1) {perror("sigdelset");return 1;}// 再次打印信号集状态,确认SIGINT已被删除if (!sigismember(&set, SIGINT)) {printf("SIGINT is no longer in the signal set.\n");}return 0;
}

程序首先使用 sigemptyset() 创建了一个空的信号集,然后使用 sigaddset() 向信号集中添加了 SIGINT 信号,通过 sigismember() 检查 SIGINT 是否成功添加到信号集中,并打印状态信息。接着使用 sigdelset() 删除了 SIGINT 信号,并再次检查信号集状态,确认 SIGINT 已被删除。运行结果乳香

4 sigismember函数测试信号是否在信号集中

使用 sigismember()函数可以测试某一个信号是否在指定的信号集中,函数原型如下所示:

#include <signal.h>int sigismember(const sigset_t *set, int signum);
  • set: 指定信号集。
  • signum: 需要进行测试的信号。
  • 返回值: 如果信号 signum 在信号集 set 中,则返回 1;如果不在信号集 set 中,则返回 0;失败则返回-1,并设置 errno。

以下是一个使用 sigismember() 的示例代码:

#include <stdio.h>
#include <signal.h>
#include <errno.h>int main() 
{sigset_t set;// 初始化信号集,包含所有信号if (sigfillset(&set) == -1) {perror("sigfillset");return 1;}// 检查SIGINT是否在信号集中if (sigismember(&set, SIGINT)) {printf("SIGINT is in the signal set.\n");} else {printf("SIGINT is not in the signal set.\n");}return 0;
}

程序首先使用 sigfillset() 填充信号集 set,使其包含所有可能的信号。然后使用 sigismember() 检查 SIGINT是否是信号集的成员,并打印相应的信息。运行结果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对标GPT-4o!不锁区、支持手机、免费使用,Moshi来啦!

7月4日凌晨&#xff0c;法国知名开源AI研究实验室Kyutai在官网发布了&#xff0c;具备看、听、说多模态大模型——Moshi。 Moshi功能与OpenAI在5月14日展示的最新模型GPT-4o差不多&#xff0c;可以听取人的语音提问后进行实时推理回答内容。但GPT-4o的语音模式要在秋天才能全面…

确认下单:购物车页面点击 去结算 按钮发起两个请求trade(显示购物车的商品信息和计算商品的总金额)findUserAddressList

文章目录 1、确认下单&#xff1a;购物车页面点击去结算1.1、在OrderController类中创建 trade 方法1.2、在CartController类中创建 checkedCartInfos1.3、CartServiceImpl 实现 checkedCartInfos的业务功能1.4、在service-cart-client模块下定义远程openFeign接口1.5、在SpzxO…

再次登榜,深兰科技荣膺全球独角兽企业500强

6月27&#xff5e;28日&#xff0c;《2024全球独角兽企业500强》榜单发布&#xff0c;深兰科技凭借在AI产业赋能和产品出海方面的出色表现&#xff0c;继2023年之后再次登榜。 《2024全球独角兽企业500强》评委会介绍&#xff0c;本届榜单的产生&#xff0c;是由“全球独角兽企…

flutter开发实战-Charles抓包设置,dio网络代理

flutter开发实战-Charles抓包设置 在开发过程中抓包&#xff0c;可以看到请求参数等数据&#xff0c;方便分析问题。flutter上使用Charles抓包设置。dio需要设置网络代理。 一、dio设置网络代理 在调试模式下需要抓包调试&#xff0c;所以需要使用代理&#xff0c;并且仅用H…

专利优先权是什么

专利优先权&#xff1a;定义、分类与重要性 在专利的世界中&#xff0c;专利优先权是一个至关重要的概念。它不仅是专利申请人权益的保障&#xff0c;更是确保创新成果得到及时和充分保护的重要工具。 一、专利优先权的定义 专利优先权是指专利申请人就其发明创造第一次在某…

CTF常用sql注入(一)联合注入和宽字节

0x01 前言 给自己总结一下sql注入的常用姿势吧&#xff0c;记录一下学习 0x02 联合 联合注入的关键词是union SQL的union联合注入原理是联合两个表进行注入攻击&#xff0c;使用union select关键词来进行联合查询。 那么为什么我们在题目中一般是只写一个呢 因为 $sql &quo…

java-数据结构与算法-02-数据结构-02-链表

文章目录 1. 概述2. 单向链表3. 单向链表&#xff08;带哨兵&#xff09;4. 双向链表&#xff08;带哨兵&#xff09;5. 环形链表&#xff08;带哨兵&#xff09;6. 习题E01. 反转单向链表-Leetcode 206E02. 根据值删除节点-Leetcode 203E03. 两数相加-Leetcode 2E04. 删除倒数…

基于C++实现的EventLoop与事件驱动编程

一&#xff0c;概念介绍 事件驱动编程&#xff08;Event-Driven&#xff09;是一种编码范式&#xff0c;常被应用在图形用户界面&#xff0c;应用程序&#xff0c;服务器开发等场景。 采用事件驱动编程的代码中&#xff0c;通常要有事件循环&#xff0c;侦听事件&#xff0c;…

封装stater时配置导入配置类提示功能

提示功能如下 使用注解导入配置属性时添加依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>

孕产妇健康管理信息平台,多家医院产科广泛运用,系统稳定,功能齐全 产科管理系统源码,三甲医院产科电子病历系统成品源代码

孕产妇健康管理信息平台&#xff0c;多家医院产科广泛运用&#xff0c;系统稳定&#xff0c;功能齐全 产科管理系统源码&#xff0c;三甲医院产科电子病历系统成品源代码 女性生育过程会面临许多的困难和问题&#xff0c;需要经常性地前往医院做详细的身心检查&#xff0c;在…

IDEA 一键部署Docker

以部署示例服务&#xff08;sevnce-demo&#xff09;为例。 配置服务器 地址、账号、密码根据实际情况填写 配置镜像仓库 地址、账号、密码根据实际情况填写 编写Dockerfile 在sevnce-demo根目录下右键&#xff0c;选择创建Dockerfile。 # 基础镜像 FROM sevnce-registry.c…

C++:求梯形面积

梯形面积 已知上底15厘米&#xff0c;下底25厘米&#xff0c;问梯形面积值是多少&#xff1f; #include<iostream> using namespace std; int main() {//梯形的面积公式&#xff08;上底下底&#xff09; 高 2//上底变量、下底变量int s,d,h,m;s15;d25;h 2*150 * 2/s ;…

Day04-jenkins-docker

Day04-jenkins-docker 9. 案例06: 基于docker的案例实现静态代码9.1 整体流程9.2 步骤与环境1) 步骤2) 环境 9.3 详细步骤1&#xff09;代码准备2&#xff09;书写dockerfile3&#xff09;准备私有仓库4&#xff09;创建jenkins任务5&#xff09;web节点上启动对应的docker容器…

信息打点web篇---前端js打点

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理前端js代码的打点思路 本文只为学习安全使用&#xff0c;切勿用于非法用途。 一切未授权的渗透行为都是违法的。 前端js打点概念与目的 javascript文件属于前端语言&#xff0c;也就是说他的代码都…

taoCMS v3.0.2 文件上传漏洞(CVE-2022-23880)

前言 CVE-2022-23880是一个影响taoCMS v3.0.2的任意文件上传漏洞。攻击者可以利用此漏洞通过上传特制的PHP文件在受影响的系统上执行任意代码。 漏洞细节 描述: 在taoCMS v3.0.2的文件管理模块中存在任意文件上传漏洞。攻击者可以通过上传恶意的PHP文件来执行任意代码。 影响…

谷粒商城笔记-03-分布式基础概念

文章目录 一&#xff0c;微服务二&#xff0c;集群、分布式三&#xff0c;远程调用四&#xff0c;负载均衡五&#xff0c;服务注册、服务发现、注册中心六&#xff0c;配置中心七&#xff0c;服务熔断、服务降级1&#xff0c;服务熔断2&#xff0c;服务降级3&#xff0c;区别 八…

window自带的远程桌面设置凭证

原视频地址&#xff1a;https://www.bilibili.com/video/BV1YW4y1z7Du/?spm_id_from333.337.search-card.all.click&vd_sourceaeb69151d5ba645d3942f9f19bd6822a 我只是根据原视频做笔记 1、确认你是windows专业版 2、进入电脑->属性 3、取消勾选 4、进入电脑->管…

<Linux> 多线程

文章目录 线程线程互斥锁死锁 线程同步生产者消费者模型POSIX信号量基于环形队列的生产消费模型 线程池 线程 线程是进程内部可以独立运行的最小单位 进程是资源分配的基本单位&#xff0c;线程是调度器调度的基本单位 线程在进程的地址空间内运行 进程内的大部分资源线程是…

苹果电脑内存满了怎么清理空间垃圾 苹果电脑内存不足怎么办 MacBook优化储存空间

在日常使用苹果电脑过程中&#xff0c;某些用户可能经常会遇到存储空间不足的问题&#xff0c;尤其是当硬盘存储了大量的文件。这不仅影响电脑的运行速度&#xff0c;还可能导致应用程序运行不稳定。 一、节省 MacBook Pro 的空间 苹果电脑的操作系统&#xff08;macOS&#x…

大模型学习笔记3【大模型】LLaMA学习笔记

文章目录 学习内容LLaMALLaMA模型结构LLaMA下载和使用好用的开源项目[Chinese-Alpaca](https://github.com/ymcui/Chinese-LLaMA-Alpaca)Chinese-Alpaca使用量化评估 学习内容 完整学习LLaMA LLaMA 2023年2月&#xff0c;由FaceBook公开了LLaMA&#xff0c;包含7B&#xff0…