嵌入式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");
    }

    // 从信号集中删除SIGINT
    if (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是否是信号集的成员,并打印相应的信息。运行结果如下:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

001:开源交易系统开发实战开篇

本专栏采用融入【主力思维】的方法学&#xff0c;包含数据抓取、特征模型开发、历史验证回归测试、每日动态风险评估管理等技术&#xff0c;较大的增强股票投资胜率&#xff0c;让IT开发者拥有一套实用的属于自己思路的专用交易软件。 先简要介绍下系统运行的成果和项目架构&a…

java版本ERP管理系统源码 Spring Cloud ERP_ERP系统_erp软件_ERP管理系统

在当今数字化时代&#xff0c;企业对高效、稳定且易于扩展的管理系统的需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、Spring Boot、…

基于Java中的SSM框架实现小型企业人事管理系统项目【项目源码+论文说明】

基于Java中的SSM框架实现小型企业人事管理系统演示 摘要 人才是企业发展的核心力量&#xff0c;所以人事管理是企业管理中一项重要的任务。传统的人事管理系统不仅效率慢而且极易出错&#xff0c;使管理者不能清楚的了解每一位员工的详细情况&#xff0c;对企业的发展形成了不…

ctfshow-web入门-命令执行(web119、web120、web121、web122)

目录 1、web119 2、web120 3、web121 4、web122 1、web119 采用 118 的 payload&#xff0c;回显 evil input&#xff0c;说明新增了过滤 单独测试一下&#xff0c;是 PATH 、BASH 被过滤了 在上一题的基础上&#xff0c;我们再介绍一个内置变量&#xff1a;$RANDOM 它会…

【日记】居然梦到了南通……(701 字)

正文 昨晚的睡眠质量很不好。做了一个很离谱的梦&#xff0c;噩梦。梦到我被一群南通给那什么了。当时直接给我吓醒了。我都不知道为什么会做这种诡异的梦。 昨晚那群孩子要去这个县里最繁华的广场跳舞。结果老师一声 “走&#xff01;” 给我都听懵了。那地方可不近啊。我们最…

化身成羊:关于羊的词群探析

在西方的神话故事中&#xff0c;像主神宙斯&#xff0c;或者基督教义中的上帝&#xff0c;通常都有化身成羊的形象。 那为什么会这样呢&#xff1f; 一、什么是神话(myth)&#xff1f; 神话&#xff0c;正式的用词是 mythology&#xff1a; mythology n.神话&#xff1b;神话…

专访ATFX首席战略官Drew Niv:以科技创新引领企业高速发展

在金融科技创新的浪潮中&#xff0c;人才是推动企业高速发展的核心驱动力&#xff0c;优质服务是引领企业急速前行的灯塔。作为差价合约领域的知名品牌&#xff0c;ATFX高度重视人才引进工作&#xff0c;秉持“聚天下英才而用之”的理念&#xff0c;在全球范围内广揽科技精英&a…

java版本工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统

工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管理的…

二氯二氰苯醌(DDQ)市场空间受限 行业需要寻求新的发展方向及机遇

二氯二氰苯醌&#xff08;DDQ&#xff09;市场空间受限 行业需要寻求新的发展方向及机遇 二氯二氰苯醌&#xff08;DDQ&#xff09;&#xff0c;学名2,3-二氯-5,6-二氰基苯醌&#xff0c;是一种亮黄色粉末状化合物&#xff0c;具有强氧化性。DDQ在化学合成中具有重要用途&#…

LInux安装nginx方法以及配置文件释义

Linux安装Nginx方法以及所遇见的坑 安装nginx注意细节1、安装所需要的依赖2、下载以及安装nginx3、所有命令执行完毕&#xff0c;启动nginx4、开通防火墙执行完以上所有命令&#xff0c;nginx安装以及启动步骤完成&#xff0c;满足基础访问&#xff0c;访问地址如下&#xff1a…

21.《C语言》——【位操作符】

&#x1f33b;开场语 亲爱的读者&#xff0c;大家好&#xff01;我是一名正在学习编程的高校生。在这个博客里&#xff0c;我将和大家一起探讨编程技巧、分享实用工具&#xff0c;并交流学习心得。希望通过我的博客&#xff0c;你能学到有用的知识&#xff0c;提高自己的技能&a…

视频怎么制作gif动态图片?GIF制作方法分享

视频怎么制作gif动态图片&#xff1f;视频制作GIF动态图片&#xff0c;不仅保留了视频的生动瞬间&#xff0c;还赋予了图像循环播放的魔力。这一技能不仅让创意表达更加丰富多彩&#xff0c;还极大地提升了视觉传播的效率和趣味性。在快节奏的数字时代&#xff0c;GIF动图以其小…

Unity 数据持久化【PlayerPrefs】

1、数据持久化 文章目录 1、数据持久化PlayerPrefs基本方法1、PlayerPrefs概念2、存储相关3、读取相关4、删除数据思考 信息的存储和读取 PlayerPrefs存储位置1、PlayerPrefs存储的数据在哪个位置2、PlayerPrefs 数据唯一性思考 排行榜功能 2、Playerprefs实践1、必备知识点-反…

文化创新与社交媒体:探索Facebook的足迹

在过去的十多年里&#xff0c;Facebook从一个简单的校园社交网络发展成为全球最大的社交媒体平台之一。它不仅改变了人们的沟通方式&#xff0c;更在许多方面推动了文化的创新和变革。本文将深入探索Facebook如何通过其平台的演进和功能创新&#xff0c;成为文化创新的重要推动…

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

目录 一、什么是 Collabora Online?二、Docker 下载并启动 CODE2.1 拉取镜像2.2 启动镜像2.3 访问界面2.4 补充:nextcloud 的镜像启动三、SpringBoot 实现 WOPI 服务3.1 什么是WOPI?3.2 Spring Boot 简单实现3.3 另一种实现方式3.4 总结四、补充:coolwsd.xml 核心配置介绍c…

SpringBoot集成beetl模板快速入门

在pom文件引入maven依赖 <dependency><groupId>com.ibeetl</groupId><artifactId>beetl-framework-starter</artifactId><version>1.1.81.RELEASE</version></dependency>写一个controller /*** author * create * descripti…

Java开发-实际工作经验和技巧-0005-使用MapStruct进行两个实体类的转换,出现所有属性值都为null的情况

Java开发-实际工作经验和技巧-0005-使用MapStruct进行两个实体类的转换,出现所有属性值都为null的情况 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;Code…

推荐系统三十六式学习笔记:原理篇.MAB问题|16|简单却有效的Bandit算法

目录 推荐就是选择MAB问题Bandit算法1.汤普森采样算法2.UCB算法3.Epsilon贪婪算法4.效果对比 冷启动总结 推荐系统的使命就是建立用户和物品之间的连接。建立连接可以理解成;为用户匹配到最佳的物品&#xff1b;但也有另一个理解就是&#xff0c;在某个时间某个位置为用户选择最…

Redis 管道(Pipeline)是什么?有什么用?

目录 1. redis 客户端-服务端模型的不足之处 2. redis 管道是什么&#xff1f;有什么好处&#xff1f; 3. 管道的使用场景 4. 管道使用的注意事项 1. redis 客户端-服务端模型的不足之处 众所周知&#xff0c;redis 是一个客户端-服务端的模型设计&#xff0c;客户端向服务…

Zoom视颊会议软件使用

GPT-3.5 (OpenAI) Zoom是一款极受欢迎的视频会议软件。使用Zoom可以方便地进行视频会议、远程授课、在线研讨会等活动。以下是Zoom的使用步骤&#xff1a; 1. 下载Zoom客户端 可以在Zoom官网上下载对应平台的Zoom客户端。下载并完成安装后&#xff0c;双击打开客户端。 2. 创建…