千锋教育嵌入式物联网教程之系统编程篇学习-04
目录
alarm函数
raise函数
abort函数
pause函数
转折点
signal函数
可重入函数
信号集
sigemptyset()
sigfillset
sigismember()
sigaddset()
sigdelset()
代码讲解
信号阻塞集
sigprocmask()
alarm函数

相当于一个闹钟,默认动作是终止调用alarm函数的进程,其实也可以处理其他函数,在A进程中使用alarm函数,让B进程退出,至于场景你可以使用单片机的FreeRTOS场景去理解



raise函数
场景分析:比如A进程的功能实现完了,想退出进程了,那么就可以发信号给自己
相当于freertos中的删除任务,本任务的作用就是初始化,任务完成后,我就删除自己释放空间。至于raise会做什么处理我就不知道了,你只需要知道它有这个功能即可

getpid()获取自己的进程号
abort函数
注意:即使SIGABRT信号被加入到了阻塞集的话,一旦使用该函数,还是会被终止。你像上面的alarm函数,产生一个SIGALRM信号,假如SIGALRM这个信号加入到了阻塞集的话,那就无法立马响应了,这就是两者的区别
最后的提醒会有所不一样,alarm是闹钟
pause函数


等待信号的产生,一般是等待另外一个进程或者线程发送信号给我 ,就有点类似于freertos的信号量一样,我设置二值信号量阻塞等待,就有点类似于了。
因此举例的话,你可以创建子进程,父进程使用pause函数,等待子进程发信息给父进程

转折点
我们之前一直讲信号的默认处理方式,那么说明肯定不仅仅是默认处理方式,其处理方式我们可以设定,就像之前的alarm函数肯定不仅仅对调用着,也可以对其他的进程者,任何实现呢?
使用函数signal()
目的:使用alarm函数对其他进程进行暂停处理
signal函数


定义一个函数地址,void*fun();



回调函数使用,跟stm32的HAL库一样,通过信号区分哪一个信号来了

目的:子进程隔1s打印一次son,而父进程隔一秒打印father,并且都是死循环,
当父进程的循环变量为6时,使用alarm(3),并且使用signal函数让它处理子进程,
因此此时子进程会退出,而父进程继续执行#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>int main()
{__pid_t pid;pid = fork();if(pid < 0){perror("fork fail\n");exit(1);}else if(pid == 0){printf("son process\n");int son ;for(son=1;son>0;son++){sleep(1);printf("son\n");}}else{printf("father process\n");int fa = 0;for(fa=1;fa>0;fa++){sleep(1);printf("father\n");if(fa == 6)
{alarm(3);
printf("father is alarm\n");
signal();
}}}}
可重入函数
多个任务并发使用,其实就是可以被中断的代码,回来后能在原来的地方继续正常运行。但是我在使用的时候,并没有理解好该类函数的作用。留个印象即可,等之后深入的就可以回想起来
基于第二点:说明只能使用栈区

代码操作:进入函数时,首先保存此时的error的值,等该函数结束后,再恢复原值

信号集
将多个信号放在一起形成一个集合(结构体中的数组,这个数组保存的就是信号集),因此可以实现一个进程同时对多个信号进行处理(在宏观上,个人觉得)。不过信号集会与信号阻塞集联系在一起,他们可以配套使用

sigemptyset()
数据类型:sigset_t
sigfillset
理解一下功能,将信号集合设置为所有信号的集合,说明里面有所有的信号了
sigismember()
sigaddset()
sigdelset()
代码讲解


信号阻塞集
用于暂缓某一个信号的通知(传送),下面的b老师并没有直接跟a说你先讲课,我等你。而是静静的等待者,等下课了,再进去通知他,再结合前面的知识知道,b老师通知a老师去开会(信号到达),但是不一定a老师会去,这就看他对这个信号如何处理了,前面有讲过信号的处理
sigprocmask()
因此信号集与信号阻塞集一起使用
场景:将sigint(来源于Ctrl + c),添加到信号集,再把该信号集添加到阻塞集,那么我们按Ctrl + c该进程不会被退出(前提是该进程是死循环)

相关文章:
千锋教育嵌入式物联网教程之系统编程篇学习-04
目录 alarm函数 raise函数 abort函数 pause函数 转折点 signal函数 可重入函数 信号集 sigemptyset() sigfillset sigismember() sigaddset() sigdelset() 代码讲解 信号阻塞集 sigprocmask() alarm函数 相当于一个闹钟,默认动作是终止调用alarm函数的进…...
【运维】什么是 DevOps?
文章目录什么是 DevOps?如何实现 DevOpsDevOps工作原理: DevOps生命周期DevOps 文化DevOps 工具:构建 DevOps 工具链DevOps 和云原生开发什么是 DevSecOps?DevOps 和站点可靠性工程 (SRE)什么是 DevOps? DevOps 通过结…...
【C++入门】引用、内联函数、auto关键字、基于范围的for循环(C++11)、指针空值nullptr(C++11)
文章目录引用引用概念引用特性引用使用场景常引用内联函数宏的优缺点?C有哪些技术替代宏?auto关键字auto不能推导的场景基于范围的for循环(C11)指针空值nullptr(C11)引用 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名&…...
《FPGA学习》->多个按键控制LED灯
🍎与其担心未来,不如现在好好努力。在这条路上,只有奋斗才能给你安全感。你若努力,全世界都会为你让路。本次项目任务,利用开发板上的4个按键KEY1,KEY2,KEY3,KEY4和2个LED灯LED1&…...
vb.net计算之.net core基础(4)-项目与程序结构(2)
目录 Namespace 语句Visual Basic 中的命名空间完全限定名命名空间可以定义什么全局关键字命名规范条件编译拆分和合并语句拆分成多行在同一行上放置多个语句为代码行添加标签注释串联成员访问运算符点运算符 `.`感叹号 `!`运算符Me 关键字MyMyBaseMyClassNamespace 语句 <…...
基于RK3588的嵌入式linux系统开发(五)——uboot优化修改(按任意按键停止autoboot)
我们通常情况下,芯片进入uboot后,会根据设置的bootdelay时间进行倒数计数。这时候在终端按任意键,即可退出autoboot,进入uboot的命令行模式。 官方提供的uboot源码中,为了防止调试串口干扰导致不能进入系统,…...
Lumerical---在FDTD和MODE工程中的PML边界条件
Lumerical---在FDTD和MODE工程中的PML边界条件 引言PML边界条件实现原理PML 类型PML 配置文件PML 配置文件选项Standard(标准)Stabilized(稳定性)Steep AngleCustom(陡角)对于不同的边界使用不同的配置FDE,varFDTD和FDTD SolverPML 参数阅读这篇前,推荐阅读边界条件综述…...
论文投稿指南——中文核心期刊推荐(社会学)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...
KVM-4、KVM 高级功能详解
1. 半虚拟化驱动 1.1 virtio 概述 KVM 是必须使用硬件虚拟化辅助技术(如 Intel VT-x 、AMD-V)的 Hypervisor,在CPU 运行效率方面有硬件支持,其效率是比较高的;在有 Intel EPT 特性支持的平台上,内存虚拟化的效率也较高。 QEMU/KVM 提供了全虚拟化环境,可以让客户机不经…...
【Linux】进程状态
文章目录1. 阻塞1. 举例2. 为什么要阻塞?3.操作系统层面上如何理解进程等待某种资源就绪呢?资源进程4. 总结2.挂起3.Linux进程状态1. R状态进程只要是R状态,就一定是在CPU运行吗?证明当前进程运行状态生成程序查看进程2. S休眠状态…...
2023河南省第二届职业技能大赛郑州市选拔赛“网络安全”项目比赛样题任务书
2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 一、竞赛时间 共计360分钟。 竞赛任务书内容 2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 A模块基础设施设置/安全加固(200分) A-1&…...
pygame8 扫雷游戏
一、游戏规则: 1、点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利 2、如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷 二、游戏主逻辑: 主要逻辑即调用run_game, 然后循环检测事件…...
c/c++开发,无可避免的模板编程实践(篇四)
一、容器与模板 前文就说到,标准库基于模板编程,定义了许多容器类以及一系列泛型算法,使程序员可以更简洁、抽象和有效地编写程序。C标准库中有大量的标准容器,这些容器通常包含一组数据或对象的集合,几乎可以和任何类…...
c++11 标准模板(STL)(std::unordered_set)(二)
定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...
GEE学习笔记 七十二:【GEE之Python版教程六】命令行简介
这篇开始就要讲解GEE相关的内容,首先聊一下命令行的内容,这个在官方文档中有详细的介绍,这里我简单说一下常用的几个命令,剩余的大家在使用过程中如果又需要可以随时查看相关官方文档的介绍。官方文档地址:https://dev…...
DDD单根 聚合根 实体 值对象
前言2004年Eric Evans 发表Domain-Driven Design –Tackling Complexity in the Heart of Software (领域驱动设计),简称Evans DDD。快二十年的时间,领域驱动设计在不断地发展,后微服务时代强调的东西,在国…...
SpringMvc介绍。
目录 1、SpringMvc概述 1、基本介绍 2、工作流程 3、bean加载控制 二、请求 1、请求映射路径 2、请求方式 3、请求参数 4、请求参数(传递json数据) 5、日期类型参数传递 三、响应 四、REST风格 1、REST简介 2、RESTful入门案例 3、RESTfu…...
华为OD机试 - 最小传递延迟(JS)
最小传递延迟 题目 通讯网络中有N个网络节点 用1 ~ N进行标识 网络通过一个有向无环图进行表示 其中图的边的值,表示节点之间的消息传递延迟 现给定相连节点之间的延时列表times[i]={u,v,w} 其中u表示源节点,v表示目的节点,w表示u和v之间的消息传递延时 请计算给定源节点到…...
学生信息管理系统(通讯录)----------通俗易懂、附源码、C语言实现
绪论: 本篇文章使结构体章节后的习题,如果你对C语言有问题,或者结构体有什么问题不妨看看我之前所写的文章(章回体),对于文件管理和内存分配问题我将在后面补上,对于这个学生信息管理系统我用了多种方法和…...
Python抽奖系统
#免费源码见文末公众号# 抽奖系统① def choujiang1():def write():with open(d:\\抽奖系统\\抽奖1.1.pickle,rb) as file:lst1pickle.load(file)namevar1.get()if name not in lst1 and name!录入成功! and name!录入失败! and name!:lst1.append(name)…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...



