Linux的信号处理

Linux信号处理 大家应该都了解当我们在Linux下面运行程序时,如果程序跑飞了,那我们可以通过Ctrl-C来终止掉跑飞的程序,其实,当我们按下Ctrl-C时,涉及到了信号的相关处理工作,所以,今天我们就来谈一谈Ctrl-C被后的信号处理吧。什么是信号信号其实是一种软件中断,它为程序提供了一种处理异步事件的方法,所谓的异步事件就是事件的发生在任何事件都有可能,很多重要的程序都需要对信号进行处理。在Linux中一共有多 阅读详情

From: http://blog.youkuaiyun.com/guosha/archive/2008/09/17/2943615.aspx

 

Linux为实现信号处理提供了比较多的接口,看似纷杂,但理清信号的关系后还是很有条理的。主要分为以下四组,怎么发送一个信号,收到一个信号后做什么样的处理,主动等待一个信号的发生,对特定信号只记录是否发生供以后再处理;四组的API如下(不考虑多线程):
发送信号 kill, alarm, arise;
安装信号 signal, sigaction;
等待信号 sigsuspend, sigwait,pause;
阻塞信号 sigfillset, sigemptyset, sigaddset, sigdelset, sigismember, sigprocmask;

 

发送信号, kill, alarm, arise
这是唯一一组由信号发送方调用的API,其中 alarm, arise都是给自己进程产生信号,而kill是可以从一个进程发送一个信号到另一个进程,因为信号的接收方一般都不做权限检查,所以发送方要有权限给的 接收方发送信号信号才能被发送,要不然我就可以写个非法程序,直接使用kill给进程1发送一个SIGKILL信号的话,你的系统基本也就OVER了。这 个权限检查的指导原则按我的理解是,发送方的有效用户是否有权限给接收方的实际用户发送信号来决定。因为,当你运行一个seteuid程序,这个程序运行 时的euid可能不再是ruid了,但是你仍然可以kill它。arise()的实现我猜就是用kill(getpid(), signo)来实现。另外系统内核检测到一些异常或是状态改变时也会给进程发送信号,如SIGINTR,SIGCHILD等等。

 

安装信号, signal, sigaction
这组API是决定收到一个信号号的处理方法。如果不显 示的安装一个信号的处理方法,系统都有对应的默认处理方法,大多数都是直接终止程序本身. 在richard stevens的APUE中说signal的信号处理需要重新安装信号处理方法,但我在FC5下测试,不重新安装也是可以的,并且正在进行信号处理时,发 送一个信号过去,该信号也不会丢失,只是暂时阻塞,等前面的信号处理完后再处理。当然当正在信号处理时发送多个信号过去,信号处理完后,可能传递一个信号 过去,其它的信号会丢失。至于直接使用signal安装信号,等信号处理完后是否会重启被该信号中断的慢速系统调用,我没有测试,不得而知。 当然你可以使用sigaction来安装信号,并显示的指明restart标志,这样被该信号中断的系统调用就会自动重启。sigaction这个API 更复杂,功能也更多灵活,可以随意定制,通过siginfo_t的结构,可以得到很多信号相关的信息。我猜现在的linux的signal都是用 sigaction封装来实现的。跟sigaction相比,signal简单多了,没理由不用它,当然,你得保证signal的语义不会对你的程序造成 冲突。

 

等待信号 pause, sigsuspend, sigwait
这组API都是等待信号的发生,可以 根据程序的实际需求来选取。pause只要接收到信号就会返回,sigsuspend跟sigwait都是只等待某些特定的信号发生,但 sigsuspend是把参数里的信号集给阻塞,而sigwait一般是先调用sigprocmask把所有的信号都阻塞,然后再等待sigwait参数 里指定的信号。通常sigwait用在多线程程序里,主线程把所有信号都mask掉,然后不同的线程用sigwait来等待自己感兴趣的信号。

 

阻塞信号 sigfillset, sigemptyset, sigaddset, sigdelset, sigismember, sigprocmask
这一组API最多也最简单,前面五个API都是对信号集的操作,用它用得到一个你想要的信号集后就可以调用sigprocmaks的设置程序的信号掩码了。

 

另外, siglongjmp, sigsetjmp是安全的在信号处理程序里跑转的两个接口。

 

最后一些跟信号处理程序里的一些注意事项
1、因为信号会中断慢速的系统调用,所以当系统调用失败时,一定要检查失败原因,当被信号中断时做出重启系统调用的动作;
2、因为信号处理有异步性,所以任何在信号处理程序里调用了不具可重入性的函数都要小心了。这里的不具可重入性的函数包括了系统调用跟自己定义的函数。
3、在信号处理程序里任何可能导致对全局变理的修改也要小心了,一个经常被人忽视的就是在信号处理程序里调用了一个系统调用后可能导致errno的修改。

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

句柄handle的释意与inode的理解

我们常在代码中看到handle的这个东西,但是就不知道什么意思怎么用。 最近就有这样的困扰,所以搜集了一下资料和查看了额一下工程代码做个简单的总结。 我们通常看到的handle的都是一个非负整数,int类型的,那么就很奇怪为什么可以代码转换为一个对象或者控制块(可以理解为一片空间或者一个结构体)使用。 查看工程代码后发现,handle虽然作为整形数据存在,其实这样看作一个指针。我们在handle的使用过程中会发现,我们首先会分配一快空间为需要的对象,然后用指针指向这片空间。最后强转为int类型,后续在

奇怪的博客 1630

linux0.11信号处理

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

FK的专栏 1367

八、Linux系统编程:多线程同步

采用信号量、互斥量与条件变量结合2种方式实现多线程同步

小脑斧的博客 296

阿里云天池大数据长期赛:金融风控-贷款违约预测(含代码)

本次比赛让自己在大数据的处理流程上有了更明确的认知,从数据清洗、特征工程、数据建模,每一个过程都能学到很多经验和知识,值得去历练。

weixin_46685991的博客 1万+

QtNodeEditor实战:构建高效可视化编程环境的完整指南

本文是QtNodeEditor实战的完整指南,详细介绍了如何利用这一基于Qt框架的可视化编程工具构建高效节点编辑器。内容涵盖从快速集成、自定义节点模型到深入理解MVC数据流架构,并提供了样式定制、场景序列化、动态端口等高级功能的实现方法,帮助开发者快速搭建灵活、可维护的可视化编程环境。

lemon的博客 700

Linux探索---“句柄”

句柄:以下内容来自百度百科: 句柄(handle),有多种意义,其中第一种是指程序设计,第二种是指Windows编程。现在大部分都是指程序设计/程序开发这类。 第一种解释: 句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。 第二种解释: 整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为...

现从事游戏开发领域 | 团队项目be_with开发进行中 web方向感兴趣者私 ——We can do all things. 3558

电机驱动技术中关于磁阻转矩生成的理解

正交在物理学和数学中指的是两个方向或两个向量之间的夹角为90°(直角)。在图中,当气隙磁场的轴线与转子轴线的夹角为90°时,我们称它们为正交。转子磁极的方向。通常由转子的磁极中心指向另一极的连线表示。转子轴线用图示中的d 轴表示。通过对定子、转子、气隙磁场、磁力线的理解,我们可以清晰地分析不同角度下电磁转矩的方向。这种分析不仅有助于电机的理论学习,还能为实际设计提供重要参考。掌握这些基础知识后,可以更好地理解电机工作原理及优化其性能。

weixin_48327795的博客 2074

linux handler,Handler的使用与原理

一、Handler的定义:主要接受子发送的数据, 并用此数据配合主线程更新.解释: 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI,进行事件分发, 比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作。 如果此时需要一个耗时的操作,例如: 联网读取数据,或者读取本地较大的一个文件的时候,你不能把...

weixin_39788386的博客 732

Python-uiautomator2保姆级安装指南:从环境配置到设备连接全流程

本文提供Python-uiautomator2的保姆级安装指南,涵盖从环境配置到设备连接的全流程。详细介绍了Python 3.6+、ADB工具等核心组件的准备,以及uiautomator2的安装和设备端服务初始化步骤,帮助开发者快速搭建Android自动化测试环境,避免常见问题。

nnn11的博客 938

pytorch中dataloader的num_workers参数

结论速递 在Windows系统中,num_workers参数建议设为0,在Linux系统则不需担心。 1 问题描述 在之前的任务超大图上的节点表征学习中,使用PyG库用于数据加载的DataLoader,ClusterLoader等类时,会涉及到参数num_workers。在不同系统环境试验该参数的设定值时,会出现不同的结果 colab(Linux),设为12 有warning message,提示num_workers参数设置不合理,不影响继续运行 /usr/local/lib/python3.7/di

qq_40990057的博客 1万+

【Linux 知识】什么是文件句柄 File Handle?

文件描述符(File Descriptor):文件描述符是文件句柄的一部分,它是一个非负整数,用于标识打开的文件。在编写应用程序时,需要注意文件句柄的使用,避免打开过多的文件句柄,从而导致系统的文件描述符资源紧张。文件句柄用于标识打开的文件,每个打开的文件都有一个唯一的文件句柄。当打开一个文件时,操作系统会为该文件分配一个文件句柄,并将其返回给应用程序。文件位置指针(File Position Pointer):文件位置指针用于标识文件中的当前位置,应用程序可以使用它来读取或写入文件。

Mercury_Lc的博客 1992

IC验证 AHB-RAM 项目(二)——接口与事务代码的编写

本文介绍了准备工作及接口、事务相关代码编写要点。在接口部分,重点说明了lvc_ahb_if.sv、rkv_ahbram_if.sv和rkv_ahbram_tb.sv三个关键文件的功能,其中rkv_ahbram_if.sv通过动态任务实现复位信号控制。事务部分则涉及lvc_ahb_types.sv中的枚举类型定义和lvc_ahb_transaction.sv中的随机化变量设置,用于构建AHB传输激励。整个验证环境采用模块化设计,通过接口实现TB与DUT的通信,为后续验证工作奠定基础。

weixin_45926435的博客 405

LINUX 信号处理_linux 信号处理流程

1、字段sa_handler是一个函数指针,用于指向原型为void handler(int)的信号处理函数地址,sighandler_t是信号捕捉函数,由signal函数注册,注册以后,在整个进程运行过程中均有效,并且。4、字段sa_mask是一个包含信号集合的结构体,该结构体内的信号表示在进行信号处理时,将要。2、如果信号处理函数正在处理信号, 并且还没有处理完毕时,又发生了一个同类型的信号,这时。1、注册一个信号处理函数,并且处理完毕一个信号之后,是否需要重新注册,才能够捕捉下一个。

2401_86402545的博客 1505

eMMC FFU固件更新实战:从协议解析到设备修复

本文详细解析eMMC FFU固件更新技术,从协议原理到实战操作,涵盖EXT_CSD寄存器操作、命令流状态机解析及专业工具使用指南。通过真实维修案例,展示如何利用FFU机制修复设备故障,并提供高级优化技巧与安全注意事项,是硬件工程师和维修技术人员的实用参考。

weixin_29191761的博客 378

yocto系列讲解[实战篇]54 - 添加Qt5和生成带Qt5的SDK

为了满足读者盆友想看yocto如何添加qt5的需求,今天就开始尝试添加meta-qt5

fulinux的博客 3869

【Linux信号处理】

1、忽略2、终止进程3、终止进程并产生core文件(记录内存映像)4、停止5、继续6、捕获并处理 (在信号发生前,先向内核注册一个函数,当信号来临时系统会自动执行该函数)

electronic_J的博客 1426

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

sigv linux 信号,LINUX 信号处理

转自:http://zhangcy.anytome.com/20060321121911820418131452020050715/35.xml一 入门信号是有雷同的或不同的历程向一个历程递交的事件。信号等闲用来向一个历程通知失常事件。术语:发生(generate):当导致信号发生的事件揭示时,例如硬件失常,就发生一个针对某个历程的信号递交(deliver): 当历程对发给它的信号历程处理时,称为...

weixin_36360543的博客 186

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

linux信号处理函数

linux中信号的处理一般分为四步 1、信号集的安装和登记 2、信号集操作 3、信号的发送 4、信号的接收  下面分阶段详细说明 1、信号集的安装和登记 使用sigaction函数对信号进行安装和登记 ngx_init_signals(ngx_log_t *log) {     ngx_signal_t      *sig;     struct sigaction

BOKE 907

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux信号处理详细介绍

建立在早期的信号处理机制(1-31)的信号是不可靠信号,意味着它不支持排队,可能会丢失,如果同一个信号连续产生多次,进程可能只相应一次,但是多个不同的信号,会按照时间顺序从后往前相应。2、当信号处理完后可能会返回产生信号的代码继续运行,如果我们捕获并处理段错误、算术异常等信号可能会产生死循环,正确的处理段错误、算数异常信号应该是备份数据并直接结束程序。当信号产生时,内核会在其维护的信号表中为对应的进程设置与该信号对应的标记,这个过程叫做递送。功能:设置要屏蔽的信号、这些信号是存储在信号集里面。......

sorryking_的博客 661

Linux 信号处理函数

#include <stdio.h> #include <unistd.h> #include <signal.h> #include <string.h> #include <ostream> #include <cerrno> static int s_handle_count = 0; static std::str...

忧桑的小兔子 2649
上一篇: linux spi驱动分析
下一篇: 3GPP TS 0710 MUX协议
CodeJoker
博客等级 码龄18年 50粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值