【信号】信号集、sigprocmask、sigpending

一、信号集操作函数

内核通过读取未决信号集来判断信号是否应被处理。信号屏蔽字mask可以影响未决信号集。而我们可以在用程序自定义set来改变mask,来达到屏蔽指定信号目的。

sigset_t set;                                        // typedef unsigned long sigset_t
int sigemptyset(sigset_t *set)                       // 将某个信号集清0
int sigfillset(sigset_t *set)                        // 将某个信号集置1
int sigaddsetset(sigset_t *set, int sino)            // 将某个信号加入信号集
int sigdelset(sigset_t *set, int signo)              // 将某个信号清出信号集
int sigismember(cosnt sigset_t *set, int signum);    // 判断某个信号是否在信号集中  

 

二、函数sigprocmask

1. 函数原型:用来屏蔽信号、解除信号屏蔽使用该函数,其本质,读取或修改进程的信号屏蔽字(PCB)

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset)

分析:

  • set:传入参数,是一个位图,set中哪个位置置为1,就表示当前进程屏蔽了哪个信号
  • oldset:传出参数,保存旧的信号屏蔽集
  • how参数取值
how说明
SIG_BLOCK当how设置为此值,set表示需要屏蔽的信号
SIGB_UNBLOCK当how设置为此值,set表示需要解除屏蔽的信号
SIG_SETMASK

当how设置为此值,set表示用于替代原始屏蔽集的新屏蔽集,相当于mask = set,若调用sigprocmask解除了对当前信号若干个信号的阻塞,则在sigprocmask返回前,至少将其中一个信号递达。

  • 严格注意,屏蔽信号:只是将信号处理延后执行(延至解除屏蔽);而忽略表示将信号丢处理

 

三、函数sigpending

     函数作用:读取当前信号的未决信号集

int sigpending(sigset_t *set);     //set传出参数

 

四、程序清单

1. 测试代码

#include <stdio.h>
#include <signal.h>
#include <unistd.h>void printped(sigset_t *ped)
{int i;for (i = 1; i < 32; i++) {if (sigismember(ped, i) == 1) putchar('1');else putchar('0');}printf("\n");
}int main()
{sigset_t myset, oldset, ped;sigemptyset(&myset);sigaddset(&myset, SIGQUIT); // Ctrl + /sigaddset(&myset, SIGINT);  // Ctrl + Csigaddset(&myset, SIGTSTP); // Ctrl + Zsigaddset(&myset, SIGSEGV);sigaddset(&myset, SIGKILL);  //无法被屏蔽sigprocmask(SIG_BLOCK, &myset, &oldset);while (1) {sigpending(&ped);printped(&ped);sleep(2);}return 0;
}

输出结果:

 

 

2. 测试代码

#include <unistd.h> 
#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>void handler(int sig);void printsigset(sigset_t *set)
{int i;for (i = 1; i < 32; ++i) {if (sigismember(set, i))putchar('1');elseputchar('0');}printf("\n");
}int main(int argc, char *argv[])
{sigset_t pset;sigset_t bset;sigemptyset(&bset);sigaddset(&bset, SIGINT);if (signal(SIGINT, handler) == SIG_ERR) {perror("signal error");exit(1);}if (signal(SIGQUIT, handler) == SIG_ERR) {perror("signal error");exit(1);}sigprocmask(SIG_BLOCK, &bset, NULL);for (; ;) {sigpending(&pset);printsigset(&pset);sleep(1);}return 0;
}void handler(int sig)
{if (sig == SIGINT)printf("recv a sig = %d\n", sig);else if (sig == SIGQUIT) {sigset_t uset;sigemptyset(&uset);sigaddset(&uset, SIGINT);sigprocmask(SIG_UNBLOCK, &uset, NULL);}
}

输出结果:

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

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

相关文章

一招让你拿下seata分布式事务框架,看这篇文章准没错!

第一阶段&#xff1a;架构师筑基必备技能 我觉得&#xff0c;但凡是个成年人应该都清楚扎实的基本功对自己的工作帮助有多重要。从各大招聘网站的招聘要求来看&#xff0c;第一条都明确说明需要扎实的Java基础。因此&#xff0c;一般笔试以及面试的第一轮&#xff0c;对基础的…

函数signal、sigaction

二、函数sigaction 修改信号处理动作(通常在Linux用来注册一个信号的捕捉函数) #inlcude<signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 参数&#xff1a; act&am…

一文了解OOM及解决方案,你还看不明白?

InnoDB总体结构 首先我们来看官网的一张图(图片来源于MySQL官网)&#xff1a; 从上图中可以看出其主要分为两部分结构&#xff0c;一部分为内存中的结构(上图左边)&#xff0c;一部分为磁盘中的结构(上图右边) 内存结构 InnoDB内存中的结构主要分为&#xff1a;Buffer Pool,…

信号 09 | 函数pause

函数pause 调用该函数可以造成进程主动挂起&#xff0c;等待信号唤醒&#xff0c;调用该系统调用的进程处于阻塞状态(主动放弃CPU)直到有信号递达将其唤醒。 将进程置为可中断睡眠状态。然后 它调用schedule()&#xff0c;使linux进程调度器找到另一个进程来运行。pause使调用…

一文搞懂JVM架构和运行时数据区,全网最新

1.Java基础面试知识点 Java中和equals和hashCode的区别int、char、long各占多少字节数int与integer的区别探探对Java多态的理解String、StringBuffer、StringBuilder区别什么是内部类&#xff1f;内部类的作用抽象类和接口区别抽象类的意义抽象类与接口的应用场景抽象类是否可…

一条正确的Java职业生涯规划,帮你突破瓶颈

面试题模块介绍&#xff1a; 一、Java 基础 JDK 和 JRE 有什么区别&#xff1f; 和 equals 的区别是什么&#xff1f;两个对象的 hashCode()相同&#xff0c;则 equals()也一定为 true&#xff0c;对吗&#xff1f;final 在 java 中有什么作用&#xff1f;java 中的 Math.roun…

【线程】线程基本函数

一、pthread_self函数 功能&#xff1a;获取线程ID。 pthread_t pthread_self(void); 线程ID&#xff1a;pthread_t类型&#xff0c;本质&#xff1a;在Linux为无符号整数(%lu)&#xff0c;其他系统可能是结构体实现线程ID是进程内部识别标志。&#xff08;两个进程间&#…

一条正确的Java职业生涯规划,顺利通过阿里Java岗面试

珍藏版&#xff08;1&#xff09;——Mybatis入门 1.什么是MyBatis 2.为什么我们要用Mybatis? 3.Mybatis快速入门 3.1 导入开发包 3.2准备测试工作 3.3 创建mybatis配置文件 3.4 编写工具类测试是否获取到连接 3.5 创建实体与映射关系文件 3.6 编写DAO 4.Mybatis工作…

一次违反常规的Java大厂面试经历,系列教学

第一部分 Java相关以及答案 答案 第二部分算法跟编程 第三部分html&JavaScript&ajax部分 答案 第四部分Javaweb部分 答案 第五部分数据库部分 答案 第六部分XML部分 答案 第七部分.流行的框架与新技术 答案 第八、九部分.软件工程与设计模式以及j2ee部分 最后 笔者…

一次违反常规的Java大厂面试经历,重难点整理

目录 Kafka的基本介绍Kafka的设计原理分析Kafka数据传输的事务特点Kafka消息存储格式副本&#xff08;replication&#xff09;策略Kafka消息分组&#xff0c;消息消费原理Kafak顺序写入与数据读取消费者&#xff08;读取数据&#xff09; Kafka的基本介绍 Kafka是最初由Lin…

一步搞定你疑惑的数据结构与算法系列,原理+实战讲解

蚂蚁金服一面&#xff1a; 下午杭州的电话&#xff0c;问有没有空&#xff0c;果断有空&#xff0c;虽然感觉略显紧张&#xff0c;有点懵逼。 面试的题目&#xff1a; HashMap和Hashtable的区别实现一个保证迭代顺序的HashMap说一说排序算法&#xff0c;稳定性&#xff0c;复…

互斥量(互斥锁)

一、互斥量mutex Linux提供一把互斥锁mutex(也称之为互斥量)每个线程在对资源操作前都尝试先加锁&#xff0c;成功加锁才能操作&#xff0c;操作结束后解锁。资源还是共享的&#xff0c;线程间也还是竞争的&#xff0c;但通过锁将资源的访问变为互斥操作&#xff0c;而后与时间…

一眼就能看懂的Java自学手册,终局之战

珍藏版&#xff08;1&#xff09;——Mybatis入门 1.什么是MyBatis 2.为什么我们要用Mybatis? 3.Mybatis快速入门 3.1 导入开发包 3.2准备测试工作 3.3 创建mybatis配置文件 3.4 编写工具类测试是否获取到连接 3.5 创建实体与映射关系文件 3.6 编写DAO 4.Mybatis工作…

Java虚拟机学习集锦是我攒来的,带你碾压面试官!

1. 一致性&#xff08;Consistency&#xff09; 一致性&#xff08;Consistency&#xff09;是指多副本&#xff08;Replications&#xff09;问题中的数据一致性。可以分为强一致性、顺序一致性与弱一致性。 1.1 强一致性&#xff08;Strict Consistency&#xff09; 也称为…

Java虚拟机学习集锦是我攒来的,看这篇文章准没错!

一面 介绍一下自己 问项目经历, 聊"数据同步" 接着聊上了 K8S 的项目 有没有什么钻研得比较深得技术&#xff1f;&#xff08;大佬&#xff1a;kubernetes, golang, prometheus, java&#xff09; kubernetes 的架构是怎么样的? 这个问题很大&#xff0c;拆成 …

文件描述符、函数open和openat

文件描述符 pcb&#xff1a;结构体一个进程有一个文件描述符&#xff1a;1024文件描述符&#xff1a;寻找磁盘文件函数open和openat 函数原型&#xff1a; include<sys/stst.h> #include<fcntl.h>int open(const char *pathname, int flags); int open(const ch…

Java这些高端技术只有你还不知道,移动架构师成长路线

并发编程共享模型篇 并发编程概览进程与线程Java线程共享模型之管程共享模型之内存共享模型之无锁共享模型之不可变共享模型之工具 共享模型之管程 原理之 Monitor(锁) 原理之伪共享 模式篇—正确姿势 同步模式之保护性智停同步模式之Blking同步模式之顺序控制异步模式之生产…

函数read、write、lseek

函数原型&#xff1a; #include<unistd.h> ssize_t read(int fd, void *buf, size_t count);返回值&#xff1a;读到的字节数&#xff0c;若已到文件尾&#xff0c;返回0&#xff1b;若出错&#xff0c;返回-1 参数&#xff1a; fd&#xff1a;函数open的返回值buf&a…

Java这些高端技术只有你还不知道,薪资翻倍

正文 我的第一份工作是在一家外企&#xff0c;当时抱着“逃离”上海的想法去了二线城市的分公司&#xff0c;但是管理文化氛围跟总部几乎都是一样的&#xff0c;这份工作经历对我后面的工作不论是做事风格、习惯上还是思考问题的方式方法上都有很大的影响。后面陆续进入国企&a…

函数dup和dup2

函数原型&#xff1a; #include<unistd.h> int dup(int oldfd);返回值&#xff1a;若成功&#xff0c;返回新的文件描述符&#xff1b;若出错&#xff0c;返回-1 参数&#xff1a; oldfd&#xff1a;要复制的文件描述符dup调用成功&#xff1a;有两个文件描述符指向同…