【Linux操作系统】深入探索Linux系统编程中的信号集操作函数

news2024/12/30 1:03:57

在Linux系统编程中,信号集操作函数是非常重要的工具,它们允许我们对信号进行管理和控制。本篇博客将详细介绍Linux系统编程中的信号集操作函数,包括信号集的创建、添加和删除信号,以及对信号集进行操作的常用函数。通过深入了解这些函数,我们将能够更好地理解和应用Linux系统编程中的信号处理机制。
在这里插入图片描述


文章目录

    • 一、信号集的创建和初始化
    • 二、信号集的操作和查询
    • 三、使用信号集进行信号处理
    • 四、综合例子
      • 代码示例:
      • 解释:


一、信号集的创建和初始化

在Linux系统中,使用sigset_t数据类型来表示信号集。我们可以使用以下函数来创建和初始化一个信号集:

  1. sigemptyset(sigset_t *set):清空信号集,即将所有信号从信号集中移除。

示例:

#include <signal.h>

int main() {
    sigset_t set;
    sigemptyset(&set);
    // 现在set为空信号集
    return 0;
}

  1. sigfillset(sigset_t *set):将所有信号添加到信号集中。

示例:

#include <signal.h>

int main() {
    sigset_t set;
    sigfillset(&set);
    // 现在set包含了所有信号
    return 0;
}

  1. sigaddset(sigset_t *set, int signum):将指定的信号添加到信号集中。

示例:

#include <signal.h>

int main() {
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    // 现在set中包含了SIGINT信号
    return 0;
}

  1. sigdelset(sigset_t *set, int signum):从信号集中移除指定的信号。

示例:

#include <signal.h>

int main() {
    sigset_t set;
    sigfillset(&set);
    sigdelset(&set, SIGINT);
    // 现在set中不包含SIGINT信号
    return 0;
}


二、信号集的操作和查询

在创建和初始化信号集之后,我们可以使用以下函数对信号集进行操作和查询:

  1. sigismember(const sigset_t *set, int signum):检查指定的信号是否在信号集中。

示例:

#include <signal.h>
#include <stdio.h>

int main() {
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);

    if (sigismember(&set, SIGINT)) {
        printf("SIGINT is in the set\n");
    } else {
        printf("SIGINT is not in the set\n");
    }
    return 0;
}

  1. sigprocmask(int how, const sigset_t *set, sigset_t *oldset):用于阻塞或解除阻塞指定的信号。

示例:

#include <signal.h>
#include <stdio.h>

int main() {
    sigset_t set, oldset;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);

    sigprocmask(SIG_BLOCK, &set, &oldset);
    // 现在SIGINT信号被阻塞

    // 执行一些需要阻塞SIGINT信号的代码

    sigprocmask(SIG_UNBLOCK, &set, NULL);
    // 现在解除对SIGINT信号的阻塞

    return 0;
}

三、使用信号集进行信号处理

信号集操作函数还可以与信号处理函数一起使用,以实现对特定信号的处理。

  1. sigaction(int signum, const struct sigaction *act, struct sigaction *oldact):用于设置指定信号的处理函数。

示例:

#include <signal.h>
#include <stdio.h>

void handle_signal(int signum) {
    printf("Received signal: %d\n", signum);
}

int main() {
    struct sigaction sa;
    sa.sa_handler = handle_signal;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    sigaction(SIGINT, &sa, NULL);
    // 设置SIGINT信号的处理函数为handle_signal

    while (1) {
        // 执行一些其他的工作
    }

    return 0;
}


四、综合例子

代码示例:

#include <signal.h>
#include <stdio.h>

void signal_handler(int signum) {
    printf("Received signal %d\n", signum);
}

int main() {
    sigset_t set;
    struct sigaction sa;

    sigemptyset(&set); // 初始化信号集set为空集

    sigaddset(&set, SIGINT); // 将SIGINT信号添加到set中
    sigaddset(&set, SIGUSR1); // 将SIGUSR1信号添加到set中

    sa.sa_handler = signal_handler;
    sa.sa_mask = set;
    sa.sa_flags = 0;

    sigaction(SIGINT, &sa, NULL); // 设置SIGINT的信号处理函数为signal_handler
    sigaction(SIGUSR1, &sa, NULL); // 设置SIGUSR1的信号处理函数为signal_handler

    int is_member1 = sigismember(&set, SIGINT); // 检查SIGINT是否在set中
    int is_member2 = sigismember(&set, SIGUSR1); // 检查SIGUSR1是否在set中

    printf("is_member1: %d\n", is_member1); // 输出1,表示SIGINT在set中
    printf("is_member2: %d\n", is_member2); // 输出1,表示SIGUSR1在set中

    return 0;
}

解释:

  1. 首先,我们创建了一个信号集set,并使用sigemptyset()函数将其初始化为空集。

  2. 然后,我们使用sigaddset()函数将SIGINT和SIGUSR1信号添加到set中。

  3. 接下来,我们定义了一个结构体struct sigaction,并设置了其成员变量sa_handlersignal_handler,即信号处理函数。

  4. 然后,我们将set作为sa_mask,即设置了在信号处理函数执行期间要阻塞的信号集。

  5. 使用sigaction()函数,我们将SIGINT和SIGUSR1的信号处理函数设置为signal_handler

  6. 使用sigismember()函数,我们检查了SIGINT和SIGUSR1信号是否在set中。由于我们在set中添加了这两个信号,所以输出结果为1。

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

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

相关文章

华为Atlas的迭代关系、性能特点与典型应用场景

衔接上文&#xff0c;本篇主要讲解华为Atlas训练卡的迭代关系。以及迭代后的训练卡性能特点与典型应用场景。 Atlas 300T A2 训练卡的迭代关系为Atlas 300T Pro升级到Atlas 300T A2。相比之下&#xff0c;Atlas 300T A2 性能特点&#xff1a; ○ 高度集成 AI算力、通用算力、…

无人机巡检输电线路是什么,怎么巡?

在今日科技迅速发展的时代&#xff0c;无人机为输电线路巡检提供了一种高效、安全且准确的解决方案。那么&#xff0c;为什么无人机巡检输电线路如此关键呢&#xff1f;以下是对这一问题的深入剖析。 1. 提高工作效率 传统的巡检模式与现实挑战&#xff1a;在过去&#xff0c;输…

shell脚本语句(画矩形、三角形、乘法表和小游戏)(#^.^#)

目录 一、语句 一、条件语句 一、以用户为例演示 一、显示当前登录系统的用户信息 二、显示有多少个用户 二、单分支if 一、输入脚本 二、验证结果 三、双分支if 一、输入脚本 二、验证结果 四、多分支if 一、输入脚本 二、验证 二、循环语句 一、shell版本的循环…

【Freertos基础入门】深入浅出信号量

文章目录 前言一、Freertos的信号量是什么&#xff1f;二、二进制信号量和计数型信号量是什么&#xff1f;三、信号量初步了解1.二进制信号量的使用2.give和take是什么&#xff1f;3.为什么需要动态和静态创建的方式&#xff1f; 四、二进制信号量示例代码总结 前言 本系列基于…

docker之镜像与数据卷

镜像 简介 1.镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于环境开发的软件&#xff0c;他包含运行某个软件所需的所有内容&#xff0c;包括代码、运行时库、环境变量、配置文件 2.将所有的应用和环境11&#xff0c;直接打包成docker镜像&…

健康检测智能睡眠床垫方案

《2022中国睡眠质量调查报告》调查结果显示&#xff0c;16&#xff05;的被调查者存在夜间睡眠时间不足6个小时&#xff0c;表现为24点以后才上床睡觉&#xff0c;并且在6点之前起床&#xff1b;有83.81&#xff05;的被调查者经常受到睡眠问题困扰&#xff0c;其中入睡困难占2…

文心一言 VS 讯飞星火 VS chatgpt (79)-- 算法导论7.4 4题

四、请用go语言&#xff0c;证明:RANDOMIZED-QUICKSORT 期望运行时间是 Ω(nlgn)。 文心一言&#xff1a; 首先&#xff0c;为了证明RANDOMIZED-QUICKSORT的期望运行时间是Ω(nlg n)&#xff0c;我们需要证明在最坏的情况下&#xff0c;该算法的运行时间是O(nlg n)。然后&…

无涯教程-PHP.INI File Configuration函数

PHP配置文件php.ini是影响PHP功能的最终且最直接的方法。每次初始化PHP时都会读取php.ini文件。换句话说,无论是模块版本的httpd重新启动还是CGI版本的每次脚本执行都重新启动。如果未显示您的更改,请记住停止并重新启动httpd。 该配置文件已注释完整。键区分大小写,关键字值不…

阿里云服务器-修改ecs操作系统,把window系统更换成Linux操作系统

其他sql格式也在更新中&#xff0c;可直接查看这个系列&#xff0c;要是没有你需要的格式&#xff0c;可在评论或私信我 总目录 目录-后期更新打算 hive的nvl中的子查询 总目录我这个是window&#xff0c;默认应该都是window&#xff0c;我需要改成Linux系统第一步&#xff…

浅谈搭建CobaltStrike云服务器可能会遇到的一些问题

1.文件上传 若要将本机的文件上传至云服务器&#xff0c;你需通过Xshell来实现 先在xshell连接云服务器&#xff0c;命令行中执行rz命令&#xff0c;即可实现文件上传 若没有rz命令,则需用到以下命令进行安装(二选一): 适用于redhat linux: yum install lrzsz适用于centos或u…

使用Mavon-Editor编辑器上传本地图片到又拍云云存储(Vue+SpringBoot)

需求&#xff1a;将本地的图片上传到服务器或者云存储中&#xff0c;考虑之后&#xff0c;这里我选的是上传到又拍云云存储。 技术背景&#xff1a; 前端&#xff1a;VueAjax 后端&#xff1a;SpringBoot 存储&#xff1a;又拍云云存储原理&#xff1a;Mavon-Editor编辑器有两个…

大模型框架LangChain开发实战(二)

一、关于数据的准备及项目背景 Notion提供了团队管理的功能&#xff0c;方便团队成员进行在线协作办公&#xff0c;提高交互效率&#xff0c;notion上面的数据可能包括项目的数据&#xff0c;进度管理的数据&#xff0c;企业服务的数据等等&#xff0c;这里使用了从notion网站…

【校招VIP】产品分析能力之用户画像出发

考点介绍&#xff1a; 用户行为和交互是产品经理能力的重要部分&#xff0c;在校招中&#xff0c;基于用户画像的分析题和设计题也是高频考点。 『产品分析能力之用户画像出发』相关题目及解析内容可点击文章末尾链接查看&#xff01; 一、考点题目 1. 爱奇艺中搜索关键词“…

【C++ 学习⑮】- 模板进阶

目录 一、必须使用 typename 的场景 二、非类型模板参数 三、模板的特化 3.1 - 函数模板特化 3.2 - 类模板特化 3.2.1 - 全特化 3.2.2 - 偏特化 四、类模板分离式编译 4.1 - 分离编译的概念 4.2 - 类模板分离式的问题 4.3 - 解决方案 一、必须使用 typename 的场景 …

shell 基础3

在第一行后面追加内容 在第3行后面追加内容 在每行前面加 在第四行前面加入 -i表示添加在文本中 在每个22后面加 $a 在文件最后一行追加 匹配到每个包含22的行&#xff0c;并在之前加 把第7行整行替换 将所有匹配22的行替换 删除第5行 隔行删除&#xff0c;删除奇数行 删除偶数…

live555server环境搭建

live555环境搭建详解&#xff08;ubuntu18.04&#xff09; 1.环境依赖 openssl可选安不安 安装&#xff08;选择好版本&#xff09; sudo apt-get update sudo apt-get install openssl sudo apt-get install libssl-dev使用头文件是否可用时编译测试时记得链接&#xff08…

【C++入门到精通】C++入门 —— priority_queue(STL)优先队列

阅读导航 前言一、priority_queue简介1. 概念2. 特点 二、priority_queue使用1. 基本操作2. 底层结构 三、priority_queue模拟实现⭕ C代码⭕priority_queue中的仿函数 总结温馨提示 前言 ⭕文章绑定了VS平台下std::priority_queue的源码&#xff0c;大家可以下载了解一下&…

C#,数值计算——Ridders的多项式外推方法的计算方法与源程序

using System; namespace Legalsoft.Truffer { /// <summary> /// 通过Ridders的多项式外推方法返回函数func在点x处的导数。 /// 输入值h作为估计的初始步长&#xff1b;它不需要很小&#xff0c;而是应为x上的增量&#xff0c; /// 在此增量上func将发…

在CMD中找不到Bootrec/fixboot元素怎么办?

当您尝试在CMD中执行Bootrec/fixboot以修复Windows 7/8.1/8/10/11和Windows Server 2012等操作系统中的系统启动问题时&#xff0c;通常会遇到Bootrec/fixboot参数无效的情况。这类启动问题可能是由磁盘克隆、系统迁移、Windows更新、MBR和GPT转换等引起的。当一个问题仍然存在…

YOLO目标检测——矿石数据集图片下载分享

矿石图片&#xff0c;其中训练集包括“玄武岩”、“花岗岩”、“大理石”、“石英岩”、“煤”、“石灰石”、“砂岩”七种矿石图片。测试集包括24张相应的七种矿石图像。 数据集点击下载&#xff1a; 矿石数据集4500图片数据说明.rar