Linux信号集、信号的阻塞信号驱动

一、信号集

        信号的三种方式,即使是忽略,也仍然打断了进程的进行(相当于是捕捉了信号,执行的了空函数什么都没做),可如果在访问重要资源时不希望被打断呢?

        可以用阻塞,即产生了信号却没及时送达到进程,它处于未决状态,并不是不响应该信号,而是推迟响应

信号的状态

  • 递达delivery:信号产生并递达到进程

  • 未决pending:信号产生但未递达到进程,主要是阻塞屏蔽导致的,SIGKILL、SIGSTOP不可阻塞

        Linux内核的进程控制块 PCB 是一个结构体task_struct, 除了包含进程 id,状态,工作目录,用户 id,组 id,文件描述符表,还包含了信号相关的信息,主要指阻塞信号集和未决信号集,信号集中每个bit位对应一个信号

        阻塞信号集mask:信号对应的比特位置1,即被阻塞屏蔽,信号将处于未决状态,屏蔽解除后才能递达

        未决信号集pending:信号产生时,未决信号集中描述该信号的位置1表示未决(相当于别人给你发送了一个消息未读),当信号被处理后,该位置0(相当于消息已回)

因此可以通过设置阻塞信号集的这些bit位来决定是否阻塞

 

 信号集有关的操作函数

sigset_t set;               //信号集结构体变量  相当于设置了一个信号集
sigemptyset(sigset_t *set)  //清空信号集
sigfillset(sigset_t *set)   //信号全添加进信号集
sigaddset(sigset_t *set, int signum) //指定信号添加到信号集
sigdelset(sigset_t *set, int signum) //指定信号从信号集合中删除
sigismember(sigset_t *set, int signum) //判断一个信号是否在集合中int sigprocmask(int how, sigset_t *set, sigset_t *oset)
功能:将进程中的信号阻塞集替换成定义好的信号集set,并根据how决定是否阻塞信号
@param: how SIG_BLOCK   置1SIG_UNBOLCK 置0SIG_SETMASK 信号集设置为参数set中的信号set 设置的信号集  oset 一般给NULL即可
@return: 成功返回0失败返回-1

示例:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>void handler(int signum)
{if(signum == SIGINT){printf("i caught SIGINT,i won't stop\n");}}int main()
{struct sigaction act;act.sa_handler = handler;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGINT,&act,NULL);//block signal for a while and unblocksigset_t set;sigemptyset(&set);sigaddset(&set,SIGINT);sigprocmask(SIG_BLOCK,&set,NULL);sleep(5);sigprocmask(SIG_UNBLOCK,&set,NULL);while(1){sleep(1);}return 0;
}

二、信号驱动

int pause(void)
功能:暂停当前进程,进入休眠状态,直至收到任意信号处理完才会返回,所以可以用作信号驱动
  • 信号被忽略时,进程继续挂起暂停
  • 信号被默认终止处理时,则进程直接终止退出
  • 信号被捕捉处理,则处理完后返回-1,继续往下运行
  • 信号从屏蔽->解除屏蔽,进程仍挂起暂停,pause感受不到这个信号的产生和处理,因为在解除屏蔽的瞬间就信号抵达就处理完了,这种情况下要用sigsuspend
int sigsuspend(sigset_t *sigmask)
功能:将进程的阻塞信号集替换成sigmask信号集,然后暂停进程,相当于sigprocmask + pause的结合体,适合用于解除信号屏蔽的同时驱动

 示例:

#include <stdio.h>
#include <signal.h>
#include <unistd.h>void handler(int signum){ }void task(void)
{puts("task start");sleep(5);puts("task end");
}int main()
{struct sigaction act;act.sa_handler = handler;sigemptyset(&act.sa_mask);act.sa_flags = 0;sigaction(SIGINT,&act,NULL);sigset_t set,set1;sigemptyset(&set);sigemptyset(&set1);sigaddset(&set,SIGINT);pause();while(1){sigprocmask(SIG_BLOCK,&set,NULL);task();sigsuspend(&set1);}return 0;
}

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

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

相关文章

什么是内网什么是外网?区别是什么

内网和外网是计算机网络中的两个基本概念&#xff0c;它们在定义、特点和使用场景上有显著的区别。‌虎观代理小二将带大家详细了解内网与外网的定义以及它们之间的主要差异&#xff0c;帮助读者更好地理解和应用这两种网络。 内网&#xff08;局域网&#xff0c;LAN&#xff0…

如何在 Spring Cloud 集成 Micrometer Tracing?

1.什么是 Micrometer Tracing&#xff1f; Micrometer Tracing 是一个用于微服务架构的追踪库&#xff0c;它提供了一种简单而强大的方式来收集和报告分布式系统中的性能和调用链信息。它是 Micrometer 库的一部分&#xff0c;Micrometer 是一个用于应用程序监控的指标收集工具…

爬虫专栏第五篇:Python BeautifulSoup 库全解析:从解析器到网页数据爬取实战

简介&#xff1a;本文围绕 Python 的 BeautifulSoup 库展开&#xff0c;介绍了其安装方式&#xff0c;详细解析了各类解析器&#xff08;如标准库、lxml 库、xml 库、html5lib 等&#xff09;的特点与作用&#xff0c;并通过代码案例展示不同解析器在实际应用中的表现。同时&am…

架构06-分布式共识

零、文章目录 架构06-分布式共识 1、分布式共识 &#xff08;1&#xff09;基本概念 **分布式共识&#xff1a;**在分布式系统中&#xff0c;多个节点之间达成一致的过程。**复杂性来源&#xff1a;**网络的不可靠性和请求的并发性。**应用场景&#xff1a;**如何确保重要数…

linux基础病毒编写

linux目录介绍 /bin二进制可执行命令/etc系统管理和配置文件/etc/rc.d启动的配置文件和脚本 /home用户主目录的基点/lib标准程序设计库&#xff0c;又叫动态链接共享库 /sbin超级管理命令&#xff0c;这里存放的是系统管理员使用的管理程序 /tmp公共的临时文件存储点 /root系统…

使用Apache HttpClient上传文件

Apache HttpClient是一个强大且灵活的库&#xff0c;用于处理Java中的HTTP请求。 它支持多种HTTP方法&#xff0c;并能处理不同类型的请求体&#xff0c;包括文件上传。本 教程将演示如何使用Apache HttpClient来向服务器上传文件。 Maven依赖 要使用Apache HttpClient&…

uni-app写的微信小程序每次换账号登录时出现缓存上一个账号数据的问题

uni-app写的微信小程序每次更换另外账号登录时出现缓存上一个账号数据的问题&#xff1f; 1&#xff0c; 清除缓存数据&#xff1a;在 onShow 钩子中&#xff0c;我们将 powerStations、list 和 responseRoles 的值重置为初始状态&#xff0c;以清除之前的缓存数据。 2&…

初始Python篇(9)—— 函数

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 函数的定义及调用 函数的概念 函数的定义 函数的调用 水仙花数等自幂数的练习 函数相关参数的概念 函数的返回值 变…

【题解】—— LeetCode一周小结48

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结47 25.网络延迟时间 题目链接&#xff1a;743. 网络延迟时间 …

RK3568国产处理器 + TensorFlow框架的张量创建实验案例分享

一、实验目的 本节视频的目的是了解张量定义、了解张量的表示形式、并学习基于TensorFlow框架的张量创建方法。 二、实验原理. 张量定义 1、张量是多维数组&#xff0c;这个定义常见于各种人工智能软件。 2、张量是某种几何对象&#xff0c;不会随着坐标系的改变而改变。 3…

SpringMVC:SpringMVC的bean加载机制

问题分析 入门案例的内容已经做完了&#xff0c;在入门案例中我们创建过一个SpringMvcConfig的配置类&#xff0c;再回想前面咱们学习Spring的时候也创建过一个配置类SpringConfig。这两个配置类都需要加载资源&#xff0c;那么它们分别都需要加载哪些内容? 我们先来看下目前…

张伟楠动手学强化学习笔记|第一讲(上)

张伟楠动手学强化学习笔记|第一讲&#xff08;上&#xff09; 人工智能的两种任务类型 预测型任务 有监督学习无监督学习 决策型任务 强化学习 序贯决策(Sequential Decision Making) 智能体序贯地做出一个个决策&#xff0c;并接续看到新的观测&#xff0c;知道最终任务结…

Navicat连接SQL Server

Navicat连接SQL Server 安装自带的SQL Server客户端 去到Navicat安装目录&#xff0c;找到安装程序&#xff0c;安装即可。 安装对应版本的Microsoft ODBC Driver for SQL Server 打开Navicat输入对应的SQL Server相关信息 然后点测试连接&#xff0c;提示连接成功。

子模块、Fork、NPM 包与脚手架概述

子模块 在 Git 仓库中嵌套另一个仓库&#xff0c;通过引用的方式引入到主项目&#xff0c;版本管理依赖 Git 提交记录或分支&#xff0c;更新需手动拉取并提交&#xff0c;适用于共享代码并保持项目独立性。 优点&#xff1a;子模块支持直接查看和修改&#xff0c;保持子模块…

将一个数组逆序输出。-多语言

目录 C 语言实现 方法 1: 交换元素 方法 2: 使用辅助数组 方法 3: 使用递归 方法 4: 使用标准库函数&#xff08;C99及以上&#xff09; 总结 Python 实现 方法 1: 交换元素 方法 2: 使用切片 方法 3: 使用 reversed() 函数 方法 4: 使用 list.reverse() 方法 方法…

传智杯 A字符串拼接

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 键盘输入两个字符串&#xff0c;将这两个字符串进行拼接后输出。 输入描述: 键盘输入两个字符串 输出描述: 输出两个字符串拼接后的结果 示例1 输入 hello nihao 输出 helloni…

js高级-ajax封装和跨域

ajax简介及相关知识 原生ajax AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 按需请求&#xff0c;可以提高网站的性能 AJ…

WEB开发: 丢掉包袱,拥抱ASP.NET CORE!

今天的 Web 开发可以说进入了一个全新的时代&#xff0c;前后端分离、云原生、微服务等等一系列现代技术架构应运而生。在这个背景下&#xff0c;作为开发者&#xff0c;你一定希望找到一个高效、灵活、易于扩展且具有良好性能的框架。那么&#xff0c;ASP.NET Core 显然是一个…

D82【python 接口自动化学习】- pytest基础用法

day82 pytest初体验 学习日期&#xff1a;20241128 学习目标&#xff1a;pytest基础用法 -- pytest初体验 学习笔记&#xff1a; 文件命名规范 py测试文件必须以test_开头&#xff08;或_test结尾&#xff09;测试方法必须以test开头测试类必须以Test开头&#xff0c;并且…

前端面试热门题(二)[html\css\js\node\vue)

Vue 性能优化的方法 Vue 性能优化的方法多种多样&#xff0c;以下是一些常用的策略&#xff1a; 使用v-show替换v-if&#xff1a;v-show是通过CSS控制元素的显示与隐藏&#xff0c;而v-if是通过操作DOM来控制元素的显示与隐藏&#xff0c;频繁操作DOM会导致性能下降。因此&am…