linux 应用开发笔记---【信号:基础】

1.基本概念

信号是发生事件时对进程的通知机制,也可以称为软件中断

信号的目的是用来通信的

1.硬件发生异常,将错误信息通知给内核,然后内核将相关的信号给相关的进程

2.在终端输入特殊字符产生特殊信号

3.进程调用kill()将任意信号发送给另一个进程或者进程组

 4.发生了软件事件,借助软件触发条件,去进行通知

信号的分类:

1.忽略信号:进程直接不理会信号,除了SIGKILL 和 SIGSTOP

2.捕获信号:当信号达到进程后,执行预先绑定的信号处理函数【插一嘴,这不是就是pyqt5的信号与槽函数】,linux提供了signal()系统调用用于注册信号的处理函数

3. 执行系统的默认操作,进程不进行处理转而让系统进行处理

信号是异步的:

当产生了中断事件,然后告知程序,然后打断当前程序的正常执行流程,跳转去执行中断服务函数

信号的本质是int类型数字编号,从1开始

2.信号的分类

1.可靠信号和不可靠信号

不可靠信号(1-31)                               可靠信号(32-64)

2.实时信号和非实时信号

非实时信号不支持排队,都是不可靠信号-----【标准信号】

实时信号支持排队,是可靠信号

3.进程对信号的处理

1.signal()函数

sig_t signal(int signum, sig_t handler);signum:此参数指定需要进行设置的信号handler:sig_t 类型的函数指针,指向信号对应的信号处理函数,当进程接收到信号后会自动执行该处
理函数

2.sigaction()函数

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);signum:需要设置的信号,除了 SIGKILL 信号和 SIGSTOP 信号之外的任何信号act:描述了信号的处理方式,如果参数 act 为 NULL,则表示无需改变信号当前的处理方式oldact:如果参数oldact 不为 NULL,则会将信号之前的处理方式等信息通过参数 oldact 返回出来

4.向进程发送信号

一个进程可通过kill()向另一个进程发送信号

int kill(pid_t pid, int sig);pid:参数 pid 为正数的情况下,用于指定接收此信号的进程 pidsig:参数 sig 指定需要发送的信号,也可设置为 0,如果参数 sig 设置为 0 则表示不发送信号,但任执
行错误检查,这通常可用于检查参数 pid 指定的进程是否存在。

kill()系统调用可将信号发送给指定的进程或者进程组中的每一个进程

发送进程的权限:


超级用户root: 进程可以将信号发送给任何进程

普通用户: 发送者进程的实际用户 ID 或有效用户 ID 必须等于接收者进程的实际用户 ID 或有效用户 ID

 raise()

int raise(int sig);sig : 需要发送的信号

alarm()和pause()函数

unsigned int alarm(unsigned int seconds);设置定时器,当定时器时间到达的时候,内核会向进程发送SIGALR信号,只能触发一次int pause(void);pause()系统调用可以使得进程暂停运行、进入休眠状态,直到进程捕获到一个信号为止,只有执行了信
号处理函数并从其返回时,pause()才返回,在这种情况下,pause()返回-1,并且将 errno 设置为 EINTR

5.信号集

定义:一个可以表达多个信号(一组信号)的数据类型

初始化信号集:

int sigemptyset(sigset_t *set);sigemptyset()初始化信号集,使其不包含任何信号int sigfillset(sigset_t *set);sigfillset()函数初始化信号集,使其包含所有信号(包括所有实时信号)

信号集添加/删除信号:
 

sigset_t *set: 信号集signum:信号int sigaddset(sigset_t *set, int signum);int sigdelset(sigset_t *set, int signum);

测试信号是否在信号集

int sigismember(const sigset_t *set, int signum);在:返回 1
不在:返回0

获取信号的描述信息

char *strsignal(int sig);
psignal() 函数  :作用和perror一样
void psignal(int sig, const char *s);

信号掩码(阻塞信号传递)

处在信号掩码的信号会被阻塞,无法传递给进程进行处理,内核会将其阻塞,直到该信号从信号掩码中移除,内核才会把信号传递给进程从而进行处理

阻塞等待信号sigsuspend()

作用:将恢复信号掩码和pause()挂起进程两个动作封装成一个原子操作

int sigsuspend(const sigset_t *mask);

实时信号:

如果进程当前正在执行信号处理函数,在处理信号期间接收到了新的信号,如果该信号是信号掩码中的 成员,那么内核会将其阻塞,将该信号添加到进程的等待信号集(等待被处理,处于等待状态的信号)中, 为了确定进程中处于等待状态的是哪些信号,可以使用 sigpending()函数获取
int sigpending(sigset_t *set);set:处于等待状态的信号会存放在参数 set 所指向的信号集中

发送实时信号:

发送进程使用 sigqueue() 系统调用向另一个进程发送实时信号以及伴随数据。
接收实时信号的进程要为该信号建立一个信号处理函数,使用 sigaction 函数为信号建立处理函数,
并加入 SA_SIGINFO ,这样信号处理函数才能够接收到实时信号以及伴随数据,也就是要使用
sa_sigaction 指针指向的处理函数,而不是 sa_handler ,当然允许应用程序使用 sa_handler ,但这样就不能获取到实时信号的伴随数据了

异常退出abort()函数

void abort(void);

正常终止进程:
1.main函数通过return 语句退出程序

2.调用库函数exit()

3.系统调用终止进程,譬如exit(),_Exit()

异常终止进程:
1.被信号终止

2.调用abort函数,SIGABRT

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

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

相关文章

解决nuxt3环境中css样式失效的问题

现象: 底部播放器进度条拖动按钮没有了! 然后通过chrome开发工具检查html元素的结构: 发现progressbar这个元素是存在的,但是为什么没有显示呢,然后回到代码中: 发现原来是组件的名字写错了,多写了一个字母…

Leetcode 47 全排列 II

题意理解: 首先理解全排列是什么?全排列:使用集合中所有元素按照不同元素进行排列,将所有的排列结果的集合称为全排列。 这里的全排列难度升级了,问题在于集合中的元素是可以重复的。 问题:相同的元素会导致…

国王分金币

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币......;这种工…

docker整体环境转移

最近配了个docker,配完才发现,有点小G,还得自己安装cuda,有点麻烦,如果选择重新在新的cuda镜像上安装,也不轻松,所以找了下资料,搞出来了docker整体转移 首先介绍一个命令 docker c…

vivado约束方法5

打开向导时可用的报告功能 当定时约束向导打开时,它会阻止Vivado IDE中的大多数操作包括使用Tcl控制台或运行时序分析,以避免数据库差异。向导窗口始终位于其他Vivado IDE窗口的前面。如果你需要访问Vivado IDE菜单或窗口,必须将向导窗口移动…

深度图优化之ThreadDepthCleaner

github地址:ThreadedDepthCleaner 按github上的说明配置环境: git clone https://github.com/juniorxsound/ThreadedDepthCleaner --recursive mkdir build && cd build && cmake ../ && make -j4这一步容易出现undefined ref…

C++——引用

C出现了新的概念&#xff1a;引用。引用是某个对象的别名。 语法格式如下&#xff1a; 类型&引用名变量名&#xff1b; #include <iostream>using namespace std;int main(int argc, const char *argv[]) {int i 100;int &ir i;//给变量i起了个别名 叫ircout…

推荐一个界面设计软件aardio,配合python三分钟制作一个小软件。【批量doc文件转docx文件】

文章目录 前言一、aardio软件代码二、python代码总结 前言 aardio这个软件不多说&#xff0c;好用方便。 一、aardio软件代码 import win.ui; /*DSG{{*/ mainForm win.form(text"批量doc文件转docx文件";right623;bottom171) mainForm.add( button{cls"butto…

DataFunSummit:2023年数据科学在线峰会-核心PPT资料下载

一、峰会简介 数据会说谎&#xff1f;如何正确的挖掘并使用数据&#xff1f;前沿的科学实验如何做&#xff1f;实验又是如何欺骗你的&#xff1f;数据中台如何发挥功效&#xff1f;用户增长有捷径吗&#xff1f;数据科学的最佳实践有哪些&#xff1f; 本次峰会共包含了&#…

人工智能与数据分析:新时代的趋势和机会

目录 写在开头1. 融合AI和数据分析的趋势1.1 趋势变化1.2 数据驱动目标转换 2 对数据分析行业的影响2.1 技能需求2.2 工作流程和角色的变化2.3 创新和业务驱动的数据分析 3.场景变化3.1 场景1&#xff1a;智能决策支持系统3.1.1 智能决策支持系统的架构设计3.1.2 Python代码演示…

RocketMQ —消费重试

消费者出现异常&#xff0c;消费某条消息失败时&#xff0c; Apache RocketMQ 会根据消费重试策略重新投递该消息进行故障恢复。本文介绍消费重试机制的原理、版本兼容性和使用建议。 一、应用场景​ Apache RocketMQ 的消费重试主要解决的是业务处理逻辑失败导致的消费完整性…

windows的cmd命令常用的20个。

dir&#xff1a; dir&#xff1a;列出当前目录中的所有文件和文件夹。dir /p&#xff1a;逐页显示当前目录中的文件和文件夹。dir /s&#xff1a;递归地列出当前目录及其子目录中的文件和文件夹。 cd&#xff1a; cd C:\&#xff1a;切换到 C 盘根目录。cd Documents&#xff…

计算机系统基础-汇编指令学习

1.1 传送指令 push %ebpmov %esp,%ebpand $0xfffffff0,%esp //边界对齐指令&#xff0c;16字节对齐sub $0x20,%espmovl $0xa,0x10(%esp) //立即数10赋值给偏移量为0x10的基址寄存器espmovl $0x9,0x14(%esp) //立即数9赋值mov 0x10(%esp),%eax mov %eax,0x18(%esp) //立即数10赋…

DICOM 文件中,VR,VL,SQ,图像二进制的几个注意点

DICOM 文件的结构&#xff0c;在网上有很多的学习资料&#xff0c;这里只介绍些容易混淆的概念&#xff0c;作为回看笔记。 1. 传输语法 每个传输语法&#xff0c;起都是表达的三个概念&#xff1a;大小端、显隐式、压缩算法 DICOM Implicit VR Little Endian: 1.2.840.1000…

解决VSCode打开终端Terminal闪退的问题

一、背景 在新电脑上使用了VSCode&#xff0c;但是一打开Terminal&#xff0c;Terminal马上就消失了&#xff0c;在网上找了很久&#xff0c;都没有找到对应的分析 二、解决思路 首先&#xff0c;是从这个文档中找到了灵感&#xff0c;这个文档里面汇集了大部分的问题&#…

孩子都能学会的FPGA:第三十二课——用FPGA实现一个通用的SPI主机发送模块

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

二百一十五、Flume——Flume拓扑结构之复制和多路复用的开发案例(亲测,附截图)

一、目的 对于Flume的复制和多路复用拓扑结构&#xff0c;进行一个小的开发测试 二、复制和多路复用拓扑结构 &#xff08;一&#xff09;结构含义 Flume 支持将事件流向一个或者多个目的地。 &#xff08;二&#xff09;结构特征 这种模式可以将相同数据复制到多个channe…

使用python向neo4j中批量导入txt和csv三元组数据

1.导入txt文件 数据示例&#xff1a; &#xff08;头实体&#xff0c;关系&#xff0c;尾实体&#xff09; &#xff08;头实体&#xff0c;关系&#xff0c;尾实体&#xff09; 。。。。。。在执行python代码之前在neo4j中执行这个命令&#xff0c;清空所有节点 match (n) d…

微信生态下的私域流量载体有哪些?

私域流量的本质就是&#xff1a;降低我的获客成本&#xff0c;提高我产品服务的复购率&#xff0c;增加我和用户之间的粘性&#xff0c;挖掘用户的终身价值。 私域流量一般我们特指微信体系的个人号、公众号、社群和小程序&#xff0c;现在朋友圈和视频号也成为了打造微信私域…