Linux信号处理

信号处理——基础知识及常用算法 信号处理——基础概念及常用算法 阅读详情

大家应该都了解当我们在Linux下面运行程序时,如果程序跑飞了,那我们可以通过Ctrl-C来终止掉跑飞的程序,其实,当我们按下Ctrl-C时,涉及到了信号的相关处理工作,所以,今天我们就来谈一谈Ctrl-C被后的信号处理吧。

什么是信号

信号其实是一种软件中断,它为程序提供了一种处理异步事件的方法,所谓的异步事件就是事件的发生在任何事件都有可能,很多重要的程序都需要对信号进行处理。在Linux中一共有多少信号呢?我们可以通过在shell下运行kill -l指令,来查看Linux下的信号数目和他们对应的编号。如下图:(信号)

其中,我们把编号为1~31的信号称为普通信号,把34~64的信号称为实时信号。所有的信号名在头文件signal.h,中都被定义为正整数常量,即他们的信号编号。


信号的产生方式

在Linux下,信号可以通过一下几种方式来产生:

  1. 当用户按某些终端键时,引发终端产生的信号,例如我们前面提到的Ctrl-C按键对应的是SIGINT信号,Ctrl-\按键对应的是SIGQUIT信号。
  2. 硬件异常产生信号,例如除数为0、无效的内存引用对应的SIGSEGV信号,硬件异常产生信号不同,一旦硬件异常产生,那么他会一直存在,直到程序被终止位置,所以处理硬件异常信号一般都采用终止程序的方法。
  3. 进程调用kill(系统调用)函数可将任意信号发送给另一个进程或者进程组;(但是这条是有限制的,例如:要求接收信号和发送信号的进程的所有者必须相同,或者发送信号的所有者必须是超级用户)。
  4. 进程可以通过在shell下运行kill指令来对某个进程发出信号,kill指令是kill系统调用的一个接口。
  5. 当检测到某些软件条件时,也会产生信号。

信号的处理方式

有了信号的产生,当然也就有信号的处理,在Linux中,对信号的处理有下面的几种方式:
1. 忽略此信号,大多数信号都可以采用这种方式进行处理,除了9) SIGKILL 和19) SIGSTOP 信号。因为这两种信号都直接向内核提供了进程终止和停止的可靠办法。(SIGKILL),还有硬件异常信号我们最好不要忽略,因为硬件异常一旦产生如果不进行处理就会一直存在。
2. 捕捉信号。 进程要通知内核在某种信号产生时,需要调用一个用户函数,在用户函数中,用户可以自己定义信号处理的方式,在Linux下我们不能捕捉SIGKILL信号和SIGSTOP信号。
3. 执行系统的默认动作。


终止+core

在系统默认动作中,有一种动作叫做“终止+core”,它表示在进程当前工作目录中的core文件中复制了该进程当前的内存映像,(该文件名为:core.进程pid号),很多信号都使用了这种处理方式,例如SIGFPE信号。当产生了内存映像文件,我们可以在gdb下面进行调试。如下图:(core)

其中ulimit -c + number是指定core文件的大小上限,
ulimit -a是查看当前系统中的各个资源上限。


相关信号处理函数

  1. signal函数(指定信号的处理方式)
       #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

signum:参数为信号名,或者信号编号。
handler:为指向返回值为void参数为int的函数指针,或者是SIG_IGN或SIG_DFL宏定义。

在signal.h头文件中,上面的常量被定义如下
#define SIG_ERR (void(*)()) -1
#define SIG_DFL (void(*)()) 0
#define SIG_IGN (void(*)()) 1

其中,SIG_DFL指定信号处理的方式为默认方式,SIG_IGN指定信号处理的方式为忽略。

  1. alarm函数
       #include <unistd.h>

       unsigned int alarm(unsigned int seconds);

alarm函数相当于一个闹钟,它可以为进程注册闹钟时间,例如使用alarm(5)可以为进程注册5秒钟的闹钟时间,5秒后会产生SIGALRM信号;
如果在调用alarm函数时,之前已经为该进程注册的闹钟时间还没有超时,则该闹钟时间的余留值作为本次alarm函数调用的值返回。以前注册的闹钟时间则被新值所取代;
使用alarm(0)可以取消以前所注册的闹钟,并返回之前注

Linux信号处理函数详解 一下内容引述《Linux/Unix系统编程详解》 设计信号处理函数 信号处理函数设计得越简单越好,这样降低引发竞争条件的风险。 两种常见设计 信号处理函数设置全局性标志变量并退出,主程序对此标记进行周期性检查,一旦置位随机采取相应动作; 信号处理器函数执行某种类型的清理动作,接着终止进程或者使用非本地跳转将栈解开并将控制返回到主程序中的预定位置; 可重入函数与异步信号安全函数 可重入函数 首先区分单线程程序和多线程程序。典型的UNIX程序都具有一条执行线程,贯穿程序始终,CPU围绕单条执行逻辑来处理指令 阅读详情

相关推荐

linux信号处理函数的可重入性

在信号处理函数中,尽量使用可重入的函数接口(即操作的数据都是在堆栈上,不涉及全局变量),否则会引起数据的崩溃。一个简单的演示程序可以说明这点。 #include #include int a=0; void  handleSig5(int num, siginfo_t * info, void * no_used) { a = 5; printf("before

2603

linux0.11信号处理

linux中的信号处理函数提供了对程序异步处理的功能,比如键盘按下ctrl+c键,该操作将产生一个SIGINT信号,并被发送到当前前台的进程中。内核采用一个无符号长整形变量中(32bit)的每一个比特位来表示不同的信号,因此最多可以定义32种信号。对于一个进程来说,当收到一个信号时,有3种不同的处理方式: 1. 忽略该信号。其中SIGKILL和SIGSTOP不能忽略。 2. 捕获该信号。调用s

FK的专栏 1367

别再手动算频谱了!用这个在线FFT工具,5分钟搞定JSON/CSV数据分析

本文介绍了一款高效的在线FFT工具,帮助用户快速分析JSON/CSV格式的时域数据,5分钟内完成频谱分析。通过傅里叶变换(FFT)算法,大幅提升计算效率,解决传统手动计算的痛点,适用于工业振动分析、设备故障诊断等场景。

weixin_29172201的博客 258

泛微E8流程监控指南:如何用SQL实时追踪审批节点状态?

本文详细介绍了如何利用SQL实时监控泛微E8系统中的审批流程状态,包括核心数据表结构解析、全链路监控SQL实战以及智能预警机制设计。通过数据库直接查询和状态关联分析,帮助企业快速定位卡顿节点,提升流程效率。适用于需要优化OA系统流程管理的企业IT人员和业务主管。

weixin_30687051的博客 437

图片数据爬取工具Image-Downloader的安装和使用

文章目录1、python安装2、下载chromedriver并配置3、下载phantomjs并配置.4、安装相关python库5、使用 安装包地址:https://github.com/sczhengyabin/Image-Downloader 下载: 方式一:打开cmd,输入: git clone https://github.com/sczhengyabin/Image-Downloader.git 方式二:打开网址 1、python安装 该数据爬取工具要求python>=3.5,由于

wxplol的博客 6673

高阶玩法——Dify生成的数据自动写入mysql数据库

采用自定义工具方式,利用 python编写一个服务sql_save_post,将接收到的内容写入指定数据库的表中,并为该服务撰写一个 OpenAPI 的 schema。配置工作流:我们以写入天气预报为例,在生成天气预报内容后,连接自定义工具“sql_save_post”,将所需的字段配置完成后,实现将生成的内容自动写入mysql数据库中。编写OpenAPI的schema:在dify平台的工具栏目,创建自定义工具,输入工具名称“sql_save_post”。工具:sql_save_post;

qq_44493378的博客 8539

Winform从入门到精通(1)——Label(史上最全)

本篇文章是对专栏《winform控件从入门到精通》的详细介绍

qq_34059233的博客 4万+

[QMT量化交易小白入门]-七十一、十年回测ETF动量策略,超额年化收益率为10.6%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1854

Qt实现思维导图功能1『核心树』

利用Qt的QGraphicsView框架实现思维导图功能 百度网盘体验地址: 链接:https://pan.baidu.com/s/15x9F48agCDOQbsyH3VwVXA 提取码:8svh 注:UI风格参考博主:前行中的小猪,博文地址:https://blog.youkuaiyun.com/GoForwardToStep/article/details/124692790?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_u

浮生流年的博客 6163

【华为OD机试真题】458、堆内存申请 | 机试真题+思路参考+代码解析(CD卷)(C++、Java、Py)

题目描述 >有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为优先紧接着前一块已使用内存分配空间足够且最接近申请大小的空闲内存。

KJ.JK 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 例说读者写者模型
下一篇: Linux作业控制
_stark
博客等级 码龄11年 175粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值