【Linux】信号常见概念
创始人
2025-05-29 21:18:56

文章目录

  • 信号入门
      • 生活中的信号
      • 技术应用角度的信号
        • signal函数
        • 注意事项
    • 信号的概念
    • 信号的产生
    • 信号的记录(保存)
  • 信号处理常见方式概述

信号入门

生活中的信号

  • 你在网上买了很多件商品,在等待不同商品快递的到来 但即便快递还没有到来,你也知道快递到了的时候应该怎么处理快递,也就是你能“识别快递”
  • 当快递到达目的地了,你收到了快递到来的通知,但是你不一定要马上下楼取快递,也就是说取快递的行为并不是一定要立即执行,可以理解成在“在合适的时候去取”
  • 在你收到快递到达的通知,再到你拿到快递期间,是有一个时间窗口的,在这段时间内你并没有拿到快递,但是你知道快递已经到了,本质上是你“记住了有一个快递要去取”
  • 当你时间合适,顺利拿到快递之后,就要开始处理快递了,而处理快递的方式有三种:
    • 1、执行默认动作(打开快递,使用商品)2、执行自定义动作(快递是帮别人买的,你要将快递交给他)3、忽略(拿到快递后,放在一边继续做自己的事)
  • 快递到来的整个过程,对你来讲是异步的,你不能确定你的快递什么时候到

技术应用角度的信号

例子:

#include 
#include int main()
{while (1){printf("hello signal!\n");sleep(1);}return 0;
}
image-20220815155122089

问:为什么使用Ctrl+C后,进程就终止了呢?

实际上当用户按Ctrl+C之后,这个键盘输入会产生一个硬中断,被操作系统获取并解释成信号(Ctrl+C被解释成2号信号), 然后操作系统将2号信号发送给目标前台进程,前台进程收到2号信号后就会退出

如何验证呢?

我们可以使用signal函数对2号信号进行捕捉,证明当我们按Ctrl+C时进程确实是收到了2号信号

signal函数

#include 
typedef void (*sighandler_t)(int); //函数指针
sighandler_t signal(int signum, sighandler_t handler)

参数解析

第一个参数:需要捕捉的信号编号 第二个参数:是对捕捉信号的处理方法,是一个函数指针,函数参数是int,返回值是void类型


作用:注册信号处理动作

修改进程对信号 signum 的默认处理动作,变为自定义的函数 handler 该函数必须满足规定的函数声明形式

注意1:就算进程注册了对9号信号的处理,也无法生效,因为9号信号是无法被捕捉的, 因为9号信号能够直接
杀死进程,捕捉9号信号是很不安全的行为


注意2:通过 signal 接口注册对某个信号的处理动作,相当于是一种预定机制, 并没有产生任何实际信号


#include 
#include 
void handle(int sig)
{printf("收到%d号信号\n",sig);
}
int main()
{signal(2,handle);//对2号信号进行捕捉(注册),并没有实际信号产生while (1){printf("hello signal!\n");sleep(1);}return 0;
}

此时当该进程收到2号信号后,就会执行我们给出的handler方法,而不会像之前一样直接退出了,因为此时我们已经将2号信号的处理方式由默认改为了自定义了

image-20220815160005743

由此也证明了, 当我们按Ctrl+C时进程确实是收到了2号信号


注意事项

1)Ctrl+C产生的信号只能发送给前台进程 , 在一个命令后面加个&就可以将其放到后台运行,这样Shell就不必等待进程结束就可以接收新的命令,启动新的进程 此时可以通过kill -9 进程PID的方式来终止这个进程!

image-20220815160207124

2)Shell能同时运行一个前台进程和任意多个后台进程,但是只有前台进程才能接到像Ctrl+C这种控制键产生的信号

3)前台进程在运行过程中,用户随时可能按下Ctrl+C而产生一个信号,也就是说该进程的用户空间代码执行到任何地方都可能收到2号信号而终止,所以信号相对于进程的控制流程来说是异步的

4)信号是进程之间事件异步通知的一种方式,属于软中断


信号的概念

信号是发送给进程的,进程需要在合适的时候,执行信号对应的动作,进程必须明确各种的信号的对应的动作,和该信号是否产生无关

kill -l命令查看Linux当中的信号有哪些:

image-20220815162514919

其中:1~31号信号是普通信号,34~64号信号是实时信号 ,普通信号和实时信号各自都有31个

实际上:每个信号都有一个编号和一个宏定义名称,这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal

image-20220815162814186

信号的产生

进程在运行之前就必须能够分辨出哪个信号,以及指定对该信号的处理方式,以便信号到来之时能够及时处理,换句话说:进程在信号产生之前就应该具有识别信号并处理信号的能力,例如: 在实际生活中,人们收到某种信号, 但可能并不会立即处理该信号, 因为此时还在处理其他事情

  • 比如说早上闹钟响起,我们可能要赖床,就会关掉闹钟继续睡觉,但我们知道闹钟已经响起,起床是迟早的事

注意:信号只能由操作系统发送,但信号发送的方式有多种


信号的记录(保存)

进程已经收到信号但并不能立即处理,因为当前进程正在处理优先级更高的事情,只能将信号暂存起来,并等到合适的时候再进行处理 换句话说: 进程具有暂时保存信号的能力


当一个进程接收到某种信号后,该信号是被记录在该进程的进程PCB当中的, 发送信号的本质就是向进程控制块task_struct 中写入信号数据 PCB 只有操作系统能够读写, 操作系统会向上提供多种信号的发送方式,但本质都是操作系统向进程发送信号

OS中是在结构体中用一个变量的32位比特位来记录某种信号是否产生,

例如:

image-20220815170549746

其中比特位的位置代表信号的编号,而比特位的内容就代表是否收到对应信号.比如上述的,第2个比特位是1就表明收到了2号信号


所以:一个进程收到信号,本质就是该进程内的信号位图被修改了,也就是该进程的数据被修改了, 只有操作系统才有资格修改进程的数据,因为操作系统是进程的管理者,信号的产生本质上就是操作系统直接去修改目标进程的task_struct中的信号位图


image-20220815170937569


信号处理常见方式概述

1)默认动作:执行信号的默认注册行为, 如:9号信号:SIGKILL 杀死自身进程

2)忽略动作:忽略掉该信号,不做出任何反应 这也是一种信号处理的方式

3)自定义捕捉:如:signal函数,对信号进行捕捉,执行用户注册的行为,即调用修改后的 handler 方法

  • 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉(Catch)一个信号

其中:man 7 signal可以查看各个信号默认的处理动作

相关内容

热门资讯

SpringMVC-前后台协议... SpringMVC-前后台协议联调 4,前后台协议联调 4.1 环境准备 创建一个We...
【C语言】你真的了解结构体吗 引言✨我们知道C语言中存在着整形(int、short...),字符型(char)&#x...
一人一世界一叶一菩提什么意思,... 一人一世界一叶一菩提什么意思目录一人一世界一叶一菩提什么意思一花一世界,一叶一菩提的意思是什么?佛家...
国家的含义是什么 极速百科网 ... 国家的含义是什么目录国家的含义是什么国家的含义是什么对国家最本质的解释是什么?国家的含义是什么?国家...
如何用word制作宣传单,wo... 如何用word制作宣传单目录如何用word制作宣传单word业务传单在哪如何利用word排版制作广告...
怎么练习穿高跟鞋,很多女生穿不... 怎么练习穿高跟鞋目录怎么练习穿高跟鞋很多女生穿不惯高跟鞋,该如何舒适的驾驭高跟鞋呢?请问一下..怎么...
linux交换分区和逻辑卷 交换分区 查看交换分区: [root@localhost ~]# free ...
AGV小车的运动是怎么控制的呢... 随着市场的竞争加剧,有一家位于城市中心的酒店开始引入一些新的科技设备来提高服务水平&#...
火车票开售时间,火车票早上几点... 今天给各位分享火车票开售时间,火车票早上几点开售的知识,其中也会对火车票预订早上几点开始发售进行解释...
康熙容妃历史原型 极速百科网 ... 康熙容妃历史原型目录康熙容妃历史原型康熙容妃历史原型康熙大帝里面的容妃是历史上的真人真事吗?死后被追...
怎么鉴别镀银和纯银,纯银和镀银... 怎么鉴别镀银和纯银目录怎么鉴别镀银和纯银纯银和镀银怎么区别怎么能看出是纯银还是镀银如何鉴别银饰物品是...
麻辣烫的菜单有哪些,麻辣烫的菜... 麻辣烫的菜单有哪些目录麻辣烫的菜单有哪些麻辣烫的菜单麻辣烫的菜品有哪些?麻辣烫菜单(尽享中国特色小吃...
dhtmlx.Gantt 8.... 最新消息 如果您的当前版本的 dhtmlxGantt 早于 2.0,请查看从旧版本迁...
docker版jxTMS使用指... 本文讲解docker版jxTMS的数据查询,整个系列的文章请查看:doc...
Class文件解析 目录 Class文件格式总览 常量池(Constant Pool) 数据类型描述规则 成员变量描述规...
瑞士是什么之国,瑞士是什么之国... 瑞士是什么之国目录瑞士是什么之国瑞士是什么之国?意大利,加拿大,日本,瑞士,泰国的别称是什么?瑞士是...
带坏字的成语,带“坏”字的成语... 带坏字的成语目录带坏字的成语带“坏”字的成语有哪些?表示坏的成语?坏字开头的成语带坏字的成语 ...
伤痕累累怎么读,伤痕累累的拼音... 伤痕累累怎么读目录伤痕累累怎么读伤痕累累的拼音是什么伤痕累累的意思伤痕累累的累发什么音?伤痕累累怎么...
随车电话的咨询方法(随车电话是... 本篇文章极速百科给大家谈谈随车电话的咨询方法,以及随车电话是什么意思对应的知识点,希望对各位有所帮助...
九九乘法表-第14届蓝桥杯ST...  [导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成࿰...
DS1307 RTC模块使用 主要特性DS1307是Maxim的串行、I2C实时时钟芯片。主要特性有:工作电压&#x...
Vue学习之Vue的生命周期详... Vue学习之Vue的生命周期详细解释概览详细解释每个生命周期的应用beforeCreate(创建前)...
手机键盘输入法怎么设置,手机输... 方法一: 2. 找到并点击“系统设置”。 3. 在“系统设置”中,点击“键盘与输入法”。...
水泥由什么组成,水泥组成材料有... 水泥由什么组成目录水泥由什么组成水泥组成材料有哪些水泥的主要成份是什么?它是用什么做的?水泥的主要成...
一个银行卡可以绑几个微信,银行... 一个银行卡可以绑几个微信目录一个银行卡可以绑几个微信银行卡能绑定几个微信号一张银行卡可以绑几个微信一...
表结构是什么(表结构是啥) 表... 本篇文章极速百科给大家谈谈表结构是什么,以及表结构是啥对应的知识点,希望对各位有所帮助,不要忘了收藏...
微信小程序实现多语言方案|中英... 不管哪个系统,多语言方案套路都是一样的 1、建立多语言映射库 2、记录并存储用户选...
管理技术债 管理技术债 Philippe Kruchten, Robert Nord, Ipek Ozkaya ...
Matlab中exp(x)函数... 目录1.语法2.说明3.示例e的数字表示形式欧拉恒等式为指数函数绘图4.参考来源: 1...
拯救会议纪要!快用这三个音频转... Hello,大家好,我是指尖科技君~不知道小伙伴们平时有录音的习惯吗&#...