Linux——信号发送代码

这篇具有很好参考价值的文章主要介绍了Linux——信号发送代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.信号集操作函数

sigpromask函数

 代码详解:

​编辑

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

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

运行结果: 

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

完整代码:


一.信号集操作函数


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

Linux——信号发送代码,Linux,C++,linux,c++,运维

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方式,用一个位图替换另一个位图 

 代码详解:

Linux——信号发送代码,Linux,C++,linux,c++,运维

Linux——信号发送代码,Linux,C++,linux,c++,运维  

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

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

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

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

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

Linux——信号发送代码,Linux,C++,linux,c++,运维

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

Linux——信号发送代码,Linux,C++,linux,c++,运维

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

运行结果:

 Linux——信号发送代码,Linux,C++,linux,c++,运维

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

Linux——信号发送代码,Linux,C++,linux,c++,运维

运行结果: 

Linux——信号发送代码,Linux,C++,linux,c++,运维

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

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

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

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

Linux——信号发送代码,Linux,C++,linux,c++,运维

Linux——信号发送代码,Linux,C++,linux,c++,运维

运行结果:Linux——信号发送代码,Linux,C++,linux,c++,运维文章来源地址https://www.toymoban.com/news/detail-544505.html

完整代码:

#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;
}

到了这里,关于Linux——信号发送代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】生产者消费者模型代码实现和信号量

    一定要先理解生产者消费者模型的原理~ 文章目录 一、生产者消费者模型实现代码 二、信号量 1.基于环形队列的生产者消费者模型 总结 下面我们实现基于阻塞队列的生产消费模型: 在多线程编程中阻塞队列 (Blocking Queue) 是一种常用于实现生产者和消费者模型的数据结构。其

    2024年02月11日
    浏览(29)
  • 《Linux运维篇:Linux系统运维指南》

    《Linux运维总结:Ubuntu20.04+Ubuntu22.04配置静态固定IP地址》 《Linux运维总结:使用U盘制作Linux镜像》 《Linux运维实战:不重启识别新挂载磁盘》 《Linux运维实战:使用parted进行磁盘分区》 《Linux运维实战:fdisk和parted一键分盘格式化分区》 《Linux运维实战:Centos7.9系统实现在线

    2023年04月24日
    浏览(50)
  • 【Linux】Linux运维基础

    Linux简介 : Linux是一个开源的操作系统内核,最初由Linus Torvalds创建。它通常与GNU工具一起使用,以创建一个完整的操作系统。 Linux操作系统有许多基于内核的发行版,如Ubuntu、CentOS、Debian等,每个发行版都有其独特的特性和包管理工具。 登录和用户管理 : 使用SSH(Secure

    2024年02月04日
    浏览(36)
  • 【Linux】第八讲:Linux进程信号详解(一)_ 认识信号 | 产生信号

    「前言」文章是关于Linux进程信号方面的知识,本文的内容是Linux进程信号第一讲,讲解会比较细,下面开始! 「归属专栏」Linux系统编程 「主页链接」个人主页 「笔者」枫叶先生(fy)  「枫叶先生有点文青病」「每篇一句」  人生天地间,忽如远行客。 ——《乐府·青青陵上

    2023年04月25日
    浏览(35)
  • Linux运维:深入了解 Linux 目录结构

    💖The Begin💖点点关注,收藏不迷路💖 1、根目录表示法: 2、路径分隔符: 3、目录结构: 4、文件系统: 5、特殊目录: / 根目录: 是系统中所有其他目录和文件的起点。根目录是整个文件系统的顶级目录。 /: 根目录,一般根目录下只存放目录,不要存放文件,/etc、/bi

    2024年03月19日
    浏览(44)
  • Linux运维:推荐八款Linux远程连接工具

    目录 2、XShell 3、SecureCRT 4、PuTTY 5、WindTerm 6、iTerm2 7、MobaXterm 8、Termius 今天给大家推荐八款Linux远程连接工具,非常实用,希望对大家能有所帮助! 1、NxShell NxShell是一款开源的Linux远程管理工具,是我日常远程Linux服务器必备的工具,界面比较好看、可以直接SFTP。针对软件的

    2023年04月19日
    浏览(35)
  • 云计算Linux运维——Linux系统管理——磁盘管理

    点关注不迷路 目录 1磁盘分区管理 一、硬盘基础知识 1、硬盘的表示方法 2、查看块设备 3、硬盘分区的表示方法 4、创建文件系统/格式化 5、操作磁盘的流程 二、管理磁盘分区工具 fdisk 1、使用格式 2、查看磁盘分区 三、磁盘分区案例 1、规划 2、创建分区 3、让内核识别硬盘

    2024年02月12日
    浏览(53)
  • 云计算Linux运维——Linux系统管理——软件管理

    目录 点关注不迷路 1RPM软件管理 1、软件安装包类型 2、RPM软件安装包的组成 二、RPM软件管理操作 rpm命令 1、安装软件 2、查看软件 3、卸载软件 2yum工具介绍 一、yum工具介绍 1、优势 2、yum源配置文件 二、配置本地源安装软件 1、备份自带的HTTP源 2、编写本地源 3、清除旧的

    2024年02月06日
    浏览(42)
  • 【linux】信号——信号保存+信号处理

    自我名言 : 只有努力,才能追逐梦想,只有努力,才不会欺骗自己。 喜欢的点赞,收藏,关注一下把! 上一篇博客,我们已经学过信号预备知识和信号的产生,今天讲讲信号保存+信号处理以及其他补充知识。 补充一些概念。 实际执行信号的处理动作称为 信号递达(Delive

    2024年02月04日
    浏览(32)
  • 【Linux】深入探索Linux信号

    目录 写在前面的话 什么是信号 生活中的信号 Linux下的信号  Linux常见信号   Core核心转储         信号如何产生 键盘组合键 1.如何理解信号被进程保存 2.如何理解信号发送的本质 通过系统调用向进程发送信号 kill() 手动实现kill指令   raise() abort()[非系统调用] 如何理解

    2024年02月13日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包