Linux——信号发送代码

news2024/11/26 9:54:41

目录

一.信号集操作函数

sigpromask函数

 代码详解:

​编辑

考虑情况一:对多个信号的屏蔽

考虑情况二:取消对信号的阻塞

运行结果: 

考虑情况三:若不想让进程退出,采用自定义捕捉信号方式!

完整代码:


一.信号集操作函数


        sigset_t类型对于每种信号用一个bit表示“有效”或“无效”状态,至于这个类型内部如何存储这些bit则依赖于系统实现,从使用者的角度是不必关心的,使用者只能调用以下函数来操作sigset_t变量而不应该对它的内部数据做任何解释,比如用printf直接打印sigset_t变量是没有意义的。

sigpromask函数


    格式:int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

第一参数how : 告诉sigprocmask函数,应该做什么操作:

        SIG BLOCK: 设置某个信号为阻塞

        SIG UNBLOCK:接触对某个信号的阻塞

        SIG SETMASK: 替换阻寒位图

第二参数set:用来设置阻塞位图;

第三参数oldset:原来的阻塞位图sigpromask的第一参数大多情况下用的是SIG_SETMASK方式,用一个位图替换另一个位图 

 代码详解:

  

第一步:使用sigset_t类型创建位图结构;        第二步:初始化位图;

第三步:给阻塞位图添加信号;                第四步:将block阻塞位图设置为最终的阻塞位图

第五步:获取未决位图pending的数据信息。

第六步:自定义函数打印未决位图——利用遍历方式,将未决位图的每一比特位进行遍历打印输出。

注:阻塞信号情况是信号未决的一个分支情况!

 

考虑情况一:对多个信号的屏蔽

        该情况下,使用了vector容器,将想要阻塞的信号写入容器中,使用auto遍历方式给阻塞位图添加多个信号。 

运行结果:

 

 

考虑情况二:取消对信号的阻塞

 

运行结果: 

 

        为什么信号取消了阻塞,进程就停止了 ?

        原因: 因为2,3号信号本就是进程中断信号,信号取消阻塞,导致进程对该信号进行递达操作(默认一立即退出) 

 

想要取消对指定信号的阻塞,可以使用oblock代替block位图

 

考虑情况三:若不想让进程退出,采用自定义捕捉信号方式!

 

 

运行结果:

 

 

完整代码:

#include<iostream>
#include<signal.h>
#include<vector>
#include<unistd.h>

//打印未决位图
void Print(const sigset_t& pend){
    for(int i=31;i>=1;--i){
        if(sigismember(&pend,i)){
            std::cout<<"1";
        }
        else{
            std::cout<<"0";
        }
    }
    std::cout<<std::endl;
}

void handler(int signo){
    std::cout<<"已捕获信号:"<<signo<<std::endl;
}


int main(){

    sigset_t pending,block,oblock; //创建三个位图,一个为未决,两个为阻塞位图,
    sigemptyset(&pending);
    sigemptyset(&block);
    sigemptyset(&oblock);



    //给阻塞位图添加信号
    std::vector<int> v1;
    v1.push_back(2);
     v1.push_back(3);
     for(auto e:v1){

     sigaddset(&block,e);

    signal(e,handler);
     }


     //屏蔽信号
     sigprocmask(SIG_SETMASK,&block,&oblock);//block位图代替了oblock位图


     int cnt=1;
     while(cnt){
        sigpending(&pending);      //读取未决位图信息
        Print(pending);            //打印未决位图
        sleep(1);
        ++cnt;


        if(cnt==8){
            //取消屏蔽
            sigprocmask(SIG_SETMASK,&oblock,&block);
        }
     }
    

    return 0;
}

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

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

相关文章

Java阶段五Day02

Java阶段五Day02 文章目录 Java阶段五Day02MAVEN-聚合(多模块3)回顾多模块2个特性依赖:继承: 聚合场景聚合目的实现聚合聚合总结 远程仓库远程仓库概念配置settings.xml远程库配置注意事项 GIT详细学习git概括git历史本地版本控制相关命令git分支管理分支管理基本概念分支管理相…

axios请求错误处理Uncaught runtime errors:handleError@webpack-internal:///./node_modules/webpack-dev-server

项目环境&#xff1a; vue3.2.13 vue-cli5.0.0 注&#xff1a;该问题只是出现在开发环境&#xff0c;打包后是不会出现的。 问题描述&#xff1a; 由于需要新开一个开发项目&#xff0c;引入必备网络请求axios及他的副手&#xff08;集中处理请求及返回数据&#xff09;&a…

springboot+MySQL大学生体质测试管理系统

功能需求分析的任务是通过详细调查大学生体质测试的测试信息管理系统要处理的所有对象&#xff0c;通过充分了解大学生体质测试管理系统的工作流程&#xff0c;明确使用者的各种需求&#xff0c;充分思考之后可能扩充和改变的情况&#xff0c;然后在这个基础上来设计数据库。

C#(五十九)之三种数据结构 stack queue sortedList

堆栈&#xff08;Stack&#xff09;&#xff1a; 代表了一个后进先出的对象集合。当您需要对各项进行后进先出的访问时&#xff0c;则使用堆栈。当您在列表中添加一项&#xff0c;称为推入元素&#xff0c;当您从列表中移除一项时&#xff0c;称为弹出元素。 Stack 类的方法和…

UVM中transaction中数据持续时间的控制

一、代码 首先需要确认持续时间是在driver中进行控制 其中data_size就是数据的持续时钟周期个数

如何看待中国工业MES系统的发展现状?

如何看待中国工业MES系统的发展现状&#xff1f; MES系统在中国工厂推进是否举步维艰&#xff0c;MES系统是否多数华而不实&#xff1f;中国工业化的前途在何方&#xff1f; 什么是MES—— 制造执行系统&#xff08;MES&#xff09;一种用于监控、控制和优化制造过程的软件系统…

多元回归预测 | Matlab基于粒子群算法(PSO)优化高斯过程回归(PSO-GPR)的数据回归预测,matlab代码,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于粒子群算法(PSO)优化高斯过程回归(PSO-GPR)的数据回归预测,matlab代码,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分…

【node】借助百度智能云,识别并提取图片中的文字

效果图&#xff1a; 一、对接百度智能云 登录百度智能云&#xff1a;百度智能云-云智一体深入产业 新用户可以免费体验&#xff0c;按照下面来就行&#xff1a; 创建应用之后就会有密钥啥的了 二、在node项目中安装依赖并使用 所有依赖如下&#xff1a; "baidu-aip-sdk…

Python中的*args和**kwargs:无限可能的函数参数详解

概要 在 Python 编程中&#xff0c;*args 和 **kwargs 是常用的两个特殊参数&#xff0c;用于处理不确定数量的函数参数。它们提供了一种灵活的方式来传递和接收参数&#xff0c;使函数的定义更加通用。本文将详细介绍 *args 和 **kwargs 的使用方法&#xff0c;并提供相关代码…

UnityVR--机械臂场景9-简单流水线应用1

目录 一. 整体介绍 二. 准备工作 三. 建立流水线 1. 流水线包含的功能&#xff1a; 2. 流水线的代码结构 3. 场景实现 4. 测试运行 一. 整体介绍 流水线是在空间和时间上合理安排和组织工艺线路的一种形式&#xff0c;它涉及到一种或多种生产设备、传感器、物料传输设备等&…

企业微信群机器人开发

准备工作 已经注册了有效的企业微信账号&#xff0c;并且在客户端上已经登录现有或者新建有效的包含多名企业微信成员的群聊 创建群聊机器人 右键群聊->管理聊天信息->添加群机器人 使用群机器人 在终端某个群组添加机器人之后&#xff0c;创建者可以在机器人详情页…

【Unity天空盒的制作及使用】使用HDR图或六面图制作天空盒及天空盒的几种使用方式

前言【Unity天空盒的制作及使用】使用HDR图或六面图制作天空盒及天空盒的几种使用方式一 、制作天空盒材质1.1 使用HDR文件1.2 使用六张图片二、天空盒的使用方式2.1 场景中设置天空盒2.2 相机中设置天空盒总结前言 Unity工程中每次打开工程映入眼帘的蓝灰过渡的画面就是Unity默…

随笔 --- 是否可以用左右子树结点数差来衡量二叉树是否平衡?

这道题目来自mooc上浙江大学由陈越 、何钦铭老师主讲的数据结构课程上。 题目如下&#xff1a; 由于评论区关闭&#xff0c;在这里写下我自己的思路&#xff1a; 根据要求使用结点数来衡量是否是平衡时&#xff0c;极端条件是NR 2NL 或者反之。 如果构建二叉树时恰好构建为斜…

xxl-job使用详解(包含部分踩坑信息)

概念 XXL-JOB 是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 分布式下&#xff0c;每个服务都可以搭建为集群&#xff0c;这样的好处是可以将任务切片分给每一个服务从而实现并行执行&#xff0c;提高任务调度的处理效率。 在…

你真的会CSS?来看看这几个效果怎么做!

最近阿锋在超市排队买菜&#xff08;辣条&#xff09; 一个大叔一边给孩子买吃的一边说&#xff1a; 这些都是增加记忆力的&#xff0c;对孩子好&#xff01; 蓝莓&#xff0c;深海鱼&#xff0c;全麦面包&#xff0c;坚果儿&#xff0c;十六个核桃 不禁感叹现在的孩子们还真是…

6个美化代码片段转换截图图片在线工具推荐

有些截图的代码片段不是太美观&#xff0c;我们可以用统一的代码片段美化截图工具&#xff1a; 文章目录&#xff1a; 1、Codeimg 2.、Carbon 3、Ray.so 4、CodeKeep 5、Chalk.ist 6、Codepng Codeimg 支持设置设备系统&#xff0c;比如可选 MacOs、Windows系统样式。以及设置…

QT error: C2039: “jifen_lineEdit”: 不是“Ui::UIMainFrame”的成员

问题&#xff1a;新增控件不在ui_.h文件中 前提&#xff1a; 在ui界面新增了一个edit控件&#xff0c;在对应cpp中使用ui->jifen_lineEdit时就报错 error: C2039: “jifen_lineEdit”: 不是“Ui::UIMainFrame”的成员 或者error: no member named jifen_lineEdit in Ui::U…

java项目之二手手机回收平台系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的二手手机回收平台系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框…

论文怎么导入endnotes

我不怎么用pdf直接导入&#xff0c;感觉基本信息还要重新填比较麻烦&#xff0c;期刊基本都支持直接导入了&#xff0c; 1、知网&#xff1a; 随机选择一篇论文&#xff1a; 说实话搜索之前我以为没有结果的&#xff08;x 注意先点击前面的选中&#xff0c;然后点击导出分…

【七天入门数据库】第三天 MySQL的库表操作

系列文章传送门&#xff1a; 【七天入门数据库】第一天 MySQL的安装部署 【七天入门数据库】第二天 数据库理论基础 【七天入门数据库】第三天 MySQL的库表操作 文章目录 一、SQL语句书写规范 二、数据库的操作 三、表的基本操作 四、表的约束 五、存储引擎 六、MySQ…