Linux 修改信号的响应方式

news2024/9/27 21:23:00

修改信号的响应方式

1.signal()方法介绍:

修改信号的响应方式要用到方法signal()。需要引用头文件signal.h。signal()的原型:

在这里插入图片描述

typedef重命名了一个函数指针的类型,这个指针的类型为指向一个参数为int返回值为void的函数的指针。这个函数指针作为signal的返回值,也作为为signal的第二个参数,所以可以传入一个函数指针,即传入函数的地址,也就是函数名;signal第一个参数信号的代号,是整数值,所以是int型。signal方法表达的意思就是如果收到一个代号为signum的信号,该做出什么响应,就是用第二个参数handler来设置。

signal方法的第二个参数有三种,分别是默认、忽略和用户自定义:
默认:SIG_DFL,它实际上是把0强转成了一个(void(*)(int))类型的函数指针。
忽略:SIG_IGN,它实际上是把1强转成了一个(void(*)(int))类型的函数指针。
用户自定义:自己写的信号处理函数

2.用signal修改SIGINT信号的响应方式

在键盘上按下Ctrl+c时,会给当前终端前台执行的进程发送SIGINT信号

(1)给当前终端前台执行的进程发送SIGINT信号之后默认的响应方式

代码如下:

在这里插入图片描述

上述代码,是一个死循环,每一秒会输出一个hello。

编译并运行:

在这里插入图片描述
由结果可以看出,执行main程序之后会每隔一秒输出一个"hello",知道输入Ctrl+C之后该程序才会终止,该进程也就结束了。就是因为给当前终端前台执行的进程main发送了SIGINT信号,然后以默认方式响应,将进程结束。

也可以把代码修改为以下形式,编译和运行结果和上面的代码一样:

在这里插入图片描述

(2)给当前终端前台执行的进程发送SIGINT信号之后自定义的响应方式

代码如下:

在这里插入图片描述

代码分析:

代码顺序执行,上述代码14行的signal(SIGINT,sig_fun);其实是做了一个约定,这条代码中的signal也不是去调用SIGINT和sig_fun,而是把它两作为参数传给了signal,sig_fun什么时候调用由内核决定,因为sig_fun是一个回调函数,由用户编写但是不由用户来调用。signal()不是在while循环里面调用,而是内核调用,也就是说如果是SIGINT这个信号,内核就会帮忙调用sig_fun这个函数。改变了信号的响应方式,在给进程发送了SIGINT信号之后不再按照默认方式响应退出当前进程,而是去调用sig_fun()这个函数。当前进程在执行while循环的时候,接收到SIGINT这个信号之后while循环先暂停,内核就会帮忙去调用sig_fun这个函数,然后执行sig_fun这个函数的函数体,最后再恢复while循环的执行。

编译并运行的结果:

在这里插入图片描述

(3)给当前终端前台执行的进程发送SIGINT信号之后忽略的响应方式

代码如下:

在这里插入图片描述

编译并运行:

在这里插入图片描述

由结果可以看出,执行main程序之后,通过给当前终端前台执行的进程main发送SIGINT信号想要使进程结束的时候,并没有成功,是因为把SIGINT信号的响应方式修改成了忽略的方式,进程main将这个信号忽略掉继续执行,然后通过别的信号来终止这个程序。

(4)连续执行signal方法,该进程会以最后一次执行signal方法来响应这个信号

有以下代码:

在这里插入图片描述

在while循环中执行两次不同的signal方法,分别是忽略响应信号SIGINT和默认响应信号SIGINT。

编译并运行:

在这里插入图片描述

由结果可以看出,给正在执行的进程发送了两个SIGINT信号之后,当前进程会以最后一个SIGINT信号默认的响应方式对SIGINT信号进行响应。对于相同的信号来说,程序中最后的信号响应会把前面的信号响应覆盖掉。

(5)第一次发出SIGINT信号时,当前进程以用户自定义的方式对信号进行响应,第二次发出SIGINT信号时以默认方式对信号进行响应。

代码如下:

在这里插入图片描述

代码分析:

代码顺序执行,先执行15行代码signal(SIGINT,sig_fun),如果当前进程正在执行的时候发送信号SIGINT,这时会调sig_fun函数对该信号做出响应,打印这个信号的代号,打印完之后回到sig_fun函数中,sig_fun内部又执行了11行代码signal(SIGINT,SIG_DFL);,再一次向进程发出SIGINT信号时,就是以默认的方式响应该信号。

编译并运行的结果:

在这里插入图片描述

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

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

相关文章

学生学徒班适学人员介绍

什么是学生学徒制呢? 产业技能生态链企业与院校毕业年度学生,按照学生就业意愿,建立就业导向的学生学徒制关系,签订学徒培养协议,确定学生的就业岗位和培养计划(含岗位实习)。 泰迪-学生学…

Python中随机数的使用详解

目录标题 嗨喽~大家好呀,这里是魔王呐 ❤ ~!随机数功能1. choice(seq)2. randint(start, end)3. random()4. uniform(a, b)5. randrange(start, end, step)6. sample(seq, number)7. shuffle(lt)尾语 嗨喽~大家好呀,这里是魔王呐 ❤ ~! python资料、源码…

[JavaWeb]【二】Vue Ajax Elemnet Vue路由打包部署

目录 一 什么是Vue 1.1 Vue快速入门 1.2 常用指令 1.2.1 v-bind && v-model 1.2.2 v-on 1.2.3 v-if && v-show 1.2.4 v-for 1.2.5 案例 1.3 生命周期 二 Ajax 2.1 Ajax介绍 2.2 同步与异步 2.3 原生Ajax(繁琐,过时了&#xff09…

Windows安装 Elasticsearch 教程

下载地址 Past Releases of Elastic Stack Software | Elastic 解压 解压完的样子 进入BIN目录 D:\Develop\elasticsearch\elasticsearch-7.12.0\bin 按住shift 鼠标右键 打开 powershell 窗口 查看ES版本 .\elasticsearch.bat --version 出现问题了 警告:不赞成…

第十二课:QSsh 库编译及客户端开发

功能描述:QSsh 库编译以及如何运用 QSsh 做应用开发 一、最终演示效果 本次制作的 Demo 是通过输入主机的 IP 、端口号、用户名和密码,能够实现 SSH 自动连接,从而对远程设备进行操作。 主机(H):输入远程设备的 IP 端口(P)&…

分享twinmotion获得逼真效果的渲染技巧

正如所引用的那样,“渲染与软件无关。它关乎艺术家的眼睛、看到脑海中最终图像的能力,以及将这一愿景变为现实的技能。一些流行的渲染软件包括 V-Ray、Arnold、Unreal Engine、Blender 和 Octane Render。 其中之一是 TwinMotion,这是一款功…

自然语言处理技术:NLP句法解析树与可视化方法

自然语言处理(Natural Language Processing,NLP)句法解析树是一种表示自然语言句子结构的图形化方式。它帮助将句子中的每个词汇和短语按照语法规则连接起来,形成一个树状结构,以便更好地理解句子的语法结构和含义。句法解析树对于理解句子的句法关系、依存关系以及语义角…

自动驾驶卡车量产-第一章-用户需求

1、中国干线物流行业现状 万亿级市场,规模巨大。由中重卡承运的干线运输占到整体公路货运市场的82%,全国中重卡保有量约730 万台1,市场规模达4.6 万亿元1,体量全球第一,超过同城物流及乘用出租市场规模之和。同样&…

机器学习与模式识别3(线性回归与逻辑回归)

一、线性回归与逻辑回归简介 线性回归主要功能是拟合数据,常用平方误差函数。 逻辑回归主要功能是区分数据,找到决策边界,常用交叉熵。 二、线性回归与逻辑回归的实现 1.线性回归 利用回归方程对一个或多个特征值和目标值之间的关系进行建模…

【Unity每日一记】资源加载相关你掌握多少?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

pandas数据分析38——数据框表格拓展以及缩回对齐

案例背景 需求是这个样的: 把这个表格进行拓展。 代码实现: df pd.DataFrame(np.array([[1, 2, 3,4], [a,b, c,d], [小明,小红, 小马,小天]])) df 方法一:自定义函数: def expand_dataframe(df):m, n df.shapenew_df pd.Dat…

AutoSAR配置与实践(基础篇)2.4 RTE对Ports的支持 – C/S介绍

AutoSAR配置与实践(基础篇)2.4 RTE对Ports的支持 – C/S介绍 传送门 点击返回 ->AUTOSAR配置与实践总目录 <C/S篇前言> C/S接口算是内容稍多的章节,特别是异步C/S。因此打算分为两篇文章介绍。第一篇基础,第二篇深入。所介绍的内容,是结合Autosar标准文档作为基…

自动驾驶,一次道阻且长的远征|数据猿直播干货分享

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 在6月的世界人工智能大会上&#xff0c;马斯克在致辞中宣称&#xff0c;到2023年底&#xff0c;特斯拉便可实现L4级或L5级的完全自动驾驶&#xff08;FSD&#xff09;。两个月之后&#xff0c;马斯克又在X社交平台上发言&am…

Qt应用开发(基础篇)——选项卡窗口 QTabWidget

一、前言 QTabWidget类继承于QWidget&#xff0c;是一个拥有选项卡的窗口部件。 QTabWidget类有一个选项卡栏QTabBar和一个页面区域&#xff0c;用来显示和选项卡相关联的界面。用户通过点击选项卡或者自定义快捷方式(ALTKey)切换页面。 二、QTabWidget类 1、count 该属…

DockerFile的入门与使用

什么是 DockerFile&#xff1f; Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内容包含了一条条构建镜像所需的指令和说明。 参考Tomcat的dockerFile文件 DockerFile指令 FROM 指定父镜像: 基于哪个镜像image构建 指定基础镜像&#xff0c;必须为第一个命令MAIN…

【深入理解C语言】-- 关键字2

&#x1f407; &#x1f525;博客主页&#xff1a; 云曦 &#x1f4cb;系列专栏&#xff1a;深入理解C语言 &#x1f4a8;吾生也有涯&#xff0c;而知也无涯 &#x1f49b; 感谢大家&#x1f44d;点赞 &#x1f60b;关注&#x1f4dd;评论 文章目录 前言一、关键字 - static&…

规则的加载与管理者——KieContainer的获取与其类型的区别(虽然标题是KieContainer,其实说的还是KieServices)

之前梳理了一下有关KieServices的获取&#xff0c;与获取中的代码走向&#xff0c;详情请见&#xff1a; “万恶”之源的KieServices&#xff0c;获取代码就一行&#xff0c;表面代码越少里面东西就越多&#xff0c;本以为就是个简单的工厂方法&#xff0c;没想到里面弯弯绕绕…

vue3跳转页面后 海康监控实例不销毁

第一个页面是这样的 跳转到新的页面 只有海康的监控没有消失 使用控制台审查元素也审查不到 解决方法&#xff1a;在vue3的销毁周期把海康的监控销毁掉 import { reactive, onDeactivated} from "vue"; const state reactive({oWebControl: null as any, //监控绑…

数字乡村三维可视化监控管理平台

数字乡村是伴随网络化、信息化和数字化在农业农村经济社会发展中的应用&#xff0c;既是乡村振兴的战略方向&#xff0c;也是建设数字中国的重要内容。为了进一步提升乡村治理智能化、专业化水平&#xff0c;解决建设顶层缺失、数据孤岛等问题&#xff0c;数字孪生技术被广泛应…

16.4 【Linux】特殊文件与程序

16.4.1 具有 SUID/SGID 权限的指令执行状态 SUID 的权限其实与程序的相关性非常的大&#xff01;为什么呢&#xff1f;先来看看 SUID 的程序是如何被一般使用者执行&#xff0c;且具有什么特色呢&#xff1f; SUID 权限仅对二进制程序&#xff08;binary program&#xff09;…