Linux 修改信号的响应方式

修改信号的响应方式

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信号时,就是以默认的方式响应该信号。

编译并运行的结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue编写表单常用操作(过滤和排序)

目录 HTML代码&#xff1a; js代码&#xff1a; 效果展示&#xff1a; 此次的编写代码可以直接使用 HTML代码&#xff1a; <body><div id"app"><div v-for"(value,key) in person">{{key}}--{{value}}</div><div>商品名…

[10min速通]STM32CubemMX配置W25Q128

[10min速通]&#x1f98f;STM32CubemMX配置W25Q128 文章目录 [10min速通]&#x1f98f;STM32CubemMX配置W25Q1281、下载源码2、配置Cube2.1 基础配置2.2 SPI配置 3、配置MDK3.1 添加源文件3.2 管理源文件3.3 完成接口配置 4、接口介绍4.1 初始化4.2 擦除4.3 写入4.4 读取 5、代…

利用logstash/filebeat/插件,将graylog日志传输到kafka中

1.graylog配置输出 在System-outputs&#xff0c;选择GELF Output&#xff0c;填写如下内容&#xff0c;其它选项默认 在要输出的Stream中&#xff0c;选择Manage Outputs 选择GELF Output&#xff0c;右边选择刚才创建好的test。 2.安装logstash&#xff0c;作为中间临时…

excel 之 VBA

1、excel和VBA 高效办公&#xff0c;把重复性的工作写成VBA代码&#xff08;VB代码的衍生物&#xff0c;语法和VBA相同&#xff09;。 首先打开开发工具模式&#xff0c;如果没有选显卡&#xff0c;需要手动打开 打开程序编辑界面 快捷键 altF11一般操作 程序调试&#xf…

如何使用ChatGPT创建个性化的健身锻炼计划

ChatGPT广泛应用于各个行业&#xff0c;健身也不例外。 ChatGPT 在健身领域的一个常用案例是创建个性化的锻炼计划。 在要求 ChatGPT 创建锻炼计划时&#xff0c;简单地输入自己的目标和当前的健身水平是一个很好的开始。完成此操作后&#xff0c;你还可以使用其他提示和措施来…

.net core发布到IIS上出现 HTTP 错误 500.19

1.检查.net core 环境运行环境是否安装完成&#xff0c;类似如下环境 2.IIS是否安装全 本次原因就是IIS未安装全导致的 按照网上说的手动重启iis&#xff08;iisreset&#xff09;也不行

Next.js - Route Groups(路由组)

路由组的作用 在应用程序目录中&#xff0c;嵌套文件夹通常会映射到 URL 路径。不过&#xff0c;您可以将文件夹标记为路由组&#xff0c;以防止该文件夹包含在路由的 URL 路径中。 这样就可以在不影响 URL 路径结构的情况下&#xff0c;将路由段和项目文件组织到逻辑组中。 …

win10下如何安装ffmpeg

安装ffmpeg之前先安装win10 绿色软件管理软件&#xff1a;scoop. Scoop的基本介绍 Scoop是一款适用于Windows平台的命令行软件&#xff08;包&#xff09;管理工具&#xff0c;这里是Github介绍页。简单来说&#xff0c;就是可以通过命令行工具&#xff08;PowerShell、CMD等…

mysql使用redis+canal实现缓存一致性

目录 一、开启binlog日志 1.首先查看是否开启了binlog 2、开启binlog日志&#xff0c;并重启mysql服务 二、授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限 三、下载配置canal 1、下载 canal, 访问 release 页面 , 选择需要的包下载, 如以 1.0.17 版本为例 2、 …

无脑入门pytorch系列(四)—— scatter_

本系列教程适用于没有任何pytorch的同学&#xff08;简单的python语法还是要的&#xff09;&#xff0c;从代码的表层出发挖掘代码的深层含义&#xff0c;理解具体的意思和内涵。pytorch的很多函数看着非常简单&#xff0c;但是其中包含了很多内容&#xff0c;不了解其中的意思…

一、window配置微软商店中的Ubuntu,及错误解决方法

&#xff08;1&#xff09;首先&#xff0c;在微软商店中搜索“Ubuntu”&#xff0c;下载你喜欢的版本(此处) &#xff08;2&#xff09;设置适用于window的Linux子系统&#xff0c;跟着红色方框走 点击“确定”之后&#xff0c;会提示你重启电脑&#xff0c;按要求重启电脑即可…

unity中导入自定义模型

unity中导入自定义模型 准备软件步骤1从SoildWorks中导出模型为STEP格式2将STEP格式文件导入到3DS Max中&#xff0c;再导出为FBX格式3将FBX格式导入至unity中 准备软件 需要SoildWorks、3DS Max和Unity 3D软件步骤 1从SoildWorks中导出模型为STEP格式 2将STEP格式文件导入到…

Java Persistence APl(JPA)——JPA是啥? SpringBoot整合JPA JPA的增删改查 条件模糊查询 多对一查询

目录 引出Jpa是啥&#xff1f;Jpa的使用创建实体类写dao接口类写服务类 crud增删改查增加修改根据id删除全查询分页查询 条件查询模糊查询单条件查询多条件查询模糊查询排序查询 多对一查询定义实体类auto主键策略下新增进行全查询测试 全部代码application.yml配置类pom配置文…

K8S核心组件etcd详解(上)

1 介绍 https://etcd.io/docs/v3.5/ etcd是一个高可用的分布式键值存储系统&#xff0c;是CoreOS&#xff08;现在隶属于Red Hat&#xff09;公司开发的一个开源项目。它提供了一个简单的接口来存储和检索键值对数据&#xff0c;并使用Raft协议实现了分布式一致性。etcd广泛应用…

国产化系统中遇到的视频花屏、卡顿以及延迟问题的记录与总结

目录 1、国产化系统概述 1.1、国产化操作系统与国产化CPU 1.2、国产化服务器操作系统 1.3、当前国产化系统的主流配置 2、视频解码花屏与卡顿问题 2.1、视频解码花屏 2.2、视频解码卡顿 2.3、关于I帧和P帧的说明 3、国产显卡处理速度慢导致图像卡顿问题 3.1、视频延…

【Android Framework (十二) 】- 智能硬件设备开发

文章目录 前言智能硬件的定义与应用智能硬件产品开发流程智能硬件开发所涉及的技术体系概述关于主板选型主板CPU芯片的选择关于串口通信 总结 前言 针对我过往工作经历&#xff0c;曾在一家智能科技任职Android开发工程师&#xff0c;简单介绍下关于任职期间接触和开发过的一些…

后端返回图片资源错误404,前端使用默认图片

后端返回的图片资源可能会因为各种原因&#xff08;后台误删&#xff0c;地址更改未及时更新&#xff0c;损毁&#xff09;出现无法展示的情况&#xff0c;比如这种报错 就会导致图片资源错误&#xff0c;页面出现这种情况 用户体验很不好&#xff0c;为了改善这种情况&#xf…

第6章:支持向量机

间隔与支持向量 w为法向量&#xff0c;决定的是超平面的方向。b是偏移项&#xff0c;决定了超平面与原点之间的距离。 为什么最大化间隔&#xff0c;得到的就是最优平面呢&#xff1f; 当超平面没有正确划分正负样本时&#xff0c;几何间隔为负数。几何间隔&#xff0c;各个…

chatglm llm实时流api接口及post访问

参考&#xff1a; https://github.com/THUDM/ChatGLM-6B/pull/573/commits/02947052eefe392fd9f9632894e9551a805c6109 https://github.com/THUDM/ChatGLM-6B/pull/573 1、代码&#xff1a; 提前安装&#xff1a; sse_starlette、fastapi python stream_api.pystream_api.p…

ssm社区管理与服务系统源码和论文

ssm社区管理与服务的设计与实现031 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理&#xff0c;这正是计算机被广泛应用于信息管理系统的…