标准库函数---信号处理函数--signal

Linux——sigaction信号捕捉函数 Linux_——针对sigaction信号捕捉函数的过程剖析,理解了进程在各个情况下对信号的接收规则。 阅读详情

一  信号处理

<signal.h>

头文件<signal.h>中提供了一些用于处理程序运行期间所引发的异常条件的功能,如处理来源于外部的中断信号或程序执行期间出现的错误等事件。

9.1 signal

#include <signal.h>
void (*signal(int sig, void (*handler)(int)))(int);

signal()用于确定以后当信号sig出现时的处理方法。如果handler的值是SIG_DFL,那么就采用实现定义的缺省行为;如果handler的值是SIG_IGN,那么就忽略该信号;否则,调用handler所指向的函数(参数为信号类型)。有效的信号包括:

SIGABRT异常终止,如调用abort()。
SIGFPE算术运算出错,如除数为0或溢出。
SIGILL非法函数映象,如非法指令。
SIGINT交互式信号,如中断。
SIGSEGV非法访问存储器,如访问不存在的内存单元。
SIGTERM发送给本程序的终止请求信号。

signal()返回信号sig原来的的handler;如果出错,则返回SIG_ERR。

当随后出现信号sig时,就中断正在执行的操作,转而执行信号处理函数(*handler)(sig)。如果从信号处理程序中返回,则从中断的位置继续执行。

信号的初始状态由实现定义。

9.2 raise

#include <signal.h>
int raise(int sig);

向程序发送信号sig。如果发送不成功,就返回一个非0值。

转载自》http://www.swordair.com/docs/c-language-standard-library/chapter-9/

2 信号集

sigset_t

  
信号集及信号集操作函数:信号集被定义为一种 数据类型:
typedef struct {
unsigned long sig[_NSIG_WORDS];
} sigset_t
信号集用来描述信号的集合,linux所支持的所有信号可以全部或部分的出现在信号集中,主要与信号阻塞相关函数配合使用。下面是为信号集操作定义的相关函数:
int sigemptyset(sigset_t *set);
int sigfillset(sigset_t *set);
int sigaddset(sigset_t *set, int signum)
int sigdelset(sigset_t *set, int signum);
int sigismember(const sigset_t *set, int signum);int sigaction( int sig, const struct sigaction *act,struct sigaction *oact );
头文件
#include <signal.h>
sigemptyset(sigset_t *set)初始化由set指定的信号集,信号集里面的所有信号被清空;
sigfillset(sigset_t *set)调用该函数后,set指向的信号集中将包含linux支持的64种信号;
sigaddset(sigset_t *set, int signum)在set指向的信号集中加入signum信号;
sigdelset(sigset_t *set, int signum)在set指向的信号集中删除signum信号;
sigismember(const sigset_t *set, int signum)判定信号signum是否在set指向的信号集中。
int sigaction( int sig, const struct sigaction *act,struct sigaction *oact )检查、修改和指定信号相关联的信号响应。

百度百科

3 sigaction


sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。

他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)

给信号signum设置新的信号处理函数act, 同时保留该信号原有的信号处理函数oldact

int sigaction(int signo,const struct sigaction *restrict act,

              struct sigaction *restrict oact);

结构sigaction定义如下:

struct sigaction{
  void (*sa_handler)(int);
   sigset_t sa_mask;
  int sa_flag;
  void (*sa_sigaction)(int,siginfo_t *,void *);
};

sa_handler字段包含一个信号捕捉函数的地址

sa_mask字段说明了一个信号集,在调用该信号捕捉函数之前,这一信号集要加进进程的信号屏蔽字中。仅当从信号捕捉函数返回时再将进程的信号屏蔽字复位为原先值。

sa_flag是一个选项,主要理解两个

SA_INTERRUPT 由此信号中断的系统调用不会自动重启
SA_RESTART 由此信号中断的系统调用会自动重启

SA_SIGINFO 提供附加信息,一个指向siginfo结构的指针以及一个指向进程上下文标识符的指针

最后一个参数是一个替代的信号处理程序,当设置SA_SIGINFO时才会用他。



参考: http://blog.chinaunix.net/uid-1877180-id-3011232.html


4 信号屏蔽字
一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。

(1)


头文件
#include<signal.h>

函数原型

int sigprocmask(int how, const sigset_t *restrict set, sigset_t *restrict oldset);

根据how的方式对set和oldset进行组合,确定最后最终的信号集合。这个信号集合就是信号屏蔽字。

函数说明

一个进程的信号屏蔽字规定了当前阻塞而不能递送给该进程的信号集。sigprocmask()可以用来检测或改变目前的信号屏蔽字,其操作依参数how来决定,如果参数oldset不是NULL 指针,那么目前的信号屏蔽字会由此指针返回。如果set是一个非空指针,则参数how指示如何修改当前信号屏蔽字。每个进程都有一个用来描述哪些信号递送到进程时将被阻塞的信号集,该信号集中的所有信号在递送到进程后都将被阻塞。
参数how:
SIG_BLOCK
该进程新的信号屏蔽字是其当前信号屏蔽字和set指向信号集的并集。set包含了我
们希望阻塞的附加信号。
SIG_UNBLOCK
该进程新的信号屏蔽字是其当前信号屏蔽字和set所指向信号集的补集的交集。set包含了
我们希望解除阻塞的信号.
SIG_SETMASK
该进程新的信号屏蔽是set指向的值
如果set是个空指针,则不改变该进程的信号屏蔽字,how的值也无意义。


(2) pthread_sigmask


  • pthread_sigmask 用来定义线程的信号掩码
  • 其接口与 sigprocmask 一样-----------------这是相对sigprocmask的区别。
  • 用在多线程环境中

概念

  • 按照 POSIX, 异步 (外部) 信号发送到整个进程.
  • 所有线程共享同一个设置, 即通过 sigaction 设置的线程处置方法.
  • 每个线程有自己的信号掩码, 线程库根据该掩码决定将信号发送到哪个线程.
  • 由于 Linux 线程实现上的独特性, 外部信号始终发送到特定的线程.
http://www.cnblogs.com/qq78292959/archive/2012/04/05/2432985.html



【Linux】进程间通信之信号篇 今天我们来看进程间通信中唯一的异步通信机制-----&gt;信号我们之前看过信号量,信号量的本质是一个计数器;千万不要跟今天的信号搞混,Linux中的信号是向进程异步发送的事件通知,通知进程有事件(硬件异常、程序执行异常、外部发出信号)发生。进程间可以相互发送信号,内核也可能在内部发送信号。当信号产生时,内核向进程发送信号(在进程所在的进程表项的信号域设置对应于该信号的位图的比特位为0或者为1),... 阅读详情

相关推荐

ARMv7-M异常处理机制与优化技术详解

异常处理是嵌入式系统开发中的核心技术,直接影响系统的实时性和可靠性。ARMv7-M架构作为Cortex-M系列处理器的核心,其异常处理机制通过硬件自动化的上下文保存、向量表查找和优先级比较等流程,实现了高效的异常响应。该架构独特的优先级设计(数值越小优先级越高)和分组机制,配合尾链优化、迟到抢占等先进技术,可显著降低中断延迟。在汽车电子、工业控制等实时性要求严苛的场景中,合理配置异常优先级、使用双栈指针机制(MSP/PSP)以及动态调整BASEPRI寄存器,能够有效提升系统性能。通过MPU保护、水印检测等栈

weixin_30312563的博客 654

sigaction详细解析

sigaction详解

Haomione的博客 1万+

Python 信号处理 signal 模块

Table of Contents 1. signal模块简介1.1. signal简单示例 1.2. signal说明1.2.1. 基本的信号名 1.2.2. 常用信号处理函数 2. signal使用示例2.1. 示例1 2.2. 示例2 3. 参考资料signal模块简介最近在看Linux signal 相关内容,signal可以被用来进程间通信和异步处理。Python标准库提供了signal包

Python提高班 2890

进程间通信之信号讲解

信号 进程间通信的另外一种方式-----信号 文章目录信号前言一、终端shell命令发送信号二、信号的种类三、相关的接口函数1.信号的发送2.捕捉信号并改变信号的响应动作(重点)3.另外一组信号的收发函数总结 前言 kill -l 查看linux系统中定义的所有信号,程序员是不可以自定义信号 提示:以下是本篇文章正文内容,下面案例可供参考 一、终端shell命令发送信号 1)kill -信号的序号 进程的id 例如 kill -9 20000 kill -KILL 20000 kill -

lalalalalab的博客 1470

C库函数signal()信号处理

C语言处理SIGSEGV、SIGILL等信号示例

记录入坑和填坑的过往痕迹 786

人工智能入门系列之一: 鸢尾花(Iris)多分类的神经网络详解及代码实现

这是最好的时代,我们一起来打造属于自动驾驶汽车上路、无人机飞天、智能机器人管工厂的AI未来 人工智能领域分化为两个阵营:其一是规则式(rule-based)方法,在人工智能早期占主峰;其二是神经网络(neural network)方法,后起之秀。随着硬件水平的提高,算力的指数式增长;人工智能的重心已经从规则式的专家时代转移到神经网络的数据时代。 “神经网络”不选择把人脑熟稔的逻辑规则传授给计算机...

NLP家的码奴小荷的博客 2万+

Python信号标准库(signal包,部分os包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。要注意,signal包主要是针对UNIX平台(比如Lin

京东放养的爬虫 1550

gRPC之gRPC开发流程与入门案例

gRPC之gRPC开发流程与入门案例

YIYIYI 3757

python信号_python学习笔记——信号模块signal

基于python学习笔记——多进程间通信——Linux信号基础的学习基础,进一步学习Python标准库中的signal模块。尽管signal是python中的模块,但是主要针对UNIX平台(比如Linux,MAC OS),而Windows内核中由于对信号机制的支持不充分,所以在Windows上的Python不能发挥信号系统的功能。signal模块负责python程序内部的信号处理;典型的操作包括信...

weixin_39824223的博客 516

【文章阅读+代码复现】Point-GNN

Brief 在3D点云语义分割方法中,GNN已经做了很多可用的方案,但是在目标检测上依旧是采用比较传统的CNN和稀疏卷积的组合,这一篇文章是研究了图卷积在3D检测的中的用法。来自卡内基梅隆大学。已经被CVPR2020接收. 这里是 paper 这里是 code Abstruct 一个采用GNN设计的3D目标检测框架 过程是先将点云场景编码成图结构,随后设计了一个叫point-GNN的网络结构,在...

有所为,有所成长 1万+

ADS软件操作(10)——DAC控件使用

该控件可以用于为元件定义随频率变换的参数,如放大器的最佳负载阻抗或者源阻抗,需要双频匹配时的优化等,下图是ADS中该控件的模型。

Zhuanzhuyan的博客 4387

C复习-标准函数库:数值计算+字符串转换+日期+信号处理+locale

C复习:标准库函数

陆沙的博客 703

Matlab可调用MODTRAN5封装器之Mod5

MODTRAN 是一个计算地球大气中电磁辐射传输的软件代码。MODTRAN是通过使用具有严格格式的输入文本文件来控制的。这个文件被称为“tape5”,扩展名为.tp5或.ltn。手工创建或编辑这个文件是不方便的。Mod5提供了一组函数来简化MODTRAN用例的处理。这些方法包括将tape5文件格式读取到Mod5类“实例”或“对象”中,更改文件中描述的案例实例,将tape5格式写回文件,在案例上运行MODTRAN并将MODTRAN输出文件中的各种结果读取回Matlab。还有许多绘图方法可用。

qq_19512613的博客 3254

C标准库参考指南系列译文(9)signal.h

英文原文:http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.9.html 原文作者:Eric Huss 中文译者:柳惊鸿 Poechant 版权声明:本文的原文版权归Eric Huss所有,中文译文版权归Poechant所有。转载请注明来自"柳大的优快云博客":http://blog.youkuaiyun.com/poechant 9.

麦克船长的技术笔记 3698

【数字IC验证快速入门】26、SystemVerilog项目实践之AHB-SRAMC(6)(AHB-SRAMC SVTB Overview)

导读:作者有幸在中国电子信息领域的排头兵院校“电子科技大学”攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思、清华紫光、联发科技等业界顶尖集成电路相关企业面授课程,对数字IC验证有了一些知识积累和学习心得。为帮助想入门前端IC验证的朋友,思忱一二后,特开此专栏,以期花最短的时间,走最少的弯路,学最多的IC验证技术知识。 文章目录一、内容概述二、AHB-SRAMC 验证计划 一、内容概述 AHB-SRAMC 验证计划 AHB-SRAMC 验证平台的架构图 AHB-SRAMC 验证平台的代.

悟已往之不谏 知来者之可追 2650

用 SAP ABAP ALV 重塑 SM30:可扩展的自定义表维护视图与自动传输实践

文章摘要: 本文提出了一种基于ALV Grid的动态表维护框架,用于替代传统SM30维护视图。该方案通过输入表名自动生成维护界面,支持动态筛选、批量操作和自动传输管理。核心设计包括:利用BAdI实现扩展点、通过行状态字段简化数据变更跟踪、使用Style Table控制单元格编辑权限、集成CTS实现自动传输。相比SM30标准维护,该框架显著提升了交互体验(支持ALV排序/过滤/汇总)和业务扩展性(统一校验与权限控制),同时解决了"维护+传输"流程割裂的问题。文中详细阐述了技术实现方案,并提

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 318

python信号处理包_Python标准库07 信号 (signal包,部分os包)

原文:Python标准库07 信号 (signal包,部分os包)作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。...

weixin_39664477的博客 114

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C 标准库之 <signal.h> 详解与深度解析

C语言信号处理摘要 信号(Signal)是Unix/Linux系统中的异步事件通知机制,用于进程间通信或内核向进程发送事件通知。常见信号包括SIGINT(Ctrl+C)、SIGCHLD(子进程退出)等。C语言通过<signal.h>提供信号处理能力,包含sig_atomic_t(原子整型)和sigset_t(信号集)等关键数据类型。基本用法包括signal()函数设置信号处理程序,如捕获SIGINT信号。进阶推荐使用更可靠的sigaction()函数,支持更多特性如自动重启中断的系统调用。

qq_48379015的博客 1184

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

C 标准库 - 《signal.h》

原文链接:https://www.runoob.com/cprogramming/c-standard-library-signal-h.html 简介 signal.h头文件定义了一个变量类型sig_atomic_t、两个函数调用和一些宏来处理程序执行期间报告的不同信号。 库变量 下面是头文件 signal.h 中定义的变量类型: 序号 变量 & 描述 1 ...

老狼的专栏 230

VC中sqlite的使用

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

python信号处理库_Python标准库07 信号 (signal包,部分os包)(转载)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。要注意,signal包主要是针对UNIX平台(比如Linux, M...

weixin_39987120的博客 184

python信号处理包_Python信号 (signal包,部分os包)

在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。要注意,signal包主要是针对UNIX平台(比如Linux,MAC OS),而Windows内核中由于对信号机制的支持不充分,所以在Windows上的Python不能发挥信号系统的...

weixin_39758494的博客 226

Python标准库07 信号 (signal包,部分os包)

Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。要...

bigzql的博客 5157

python通信信号处理_python学习笔记——信号模块signal(示例代码)

基于python学习笔记——多进程间通信——Linux信号基础的学习基础,进一步学习Python标准库中的signal模块。尽管signal是python中的模块,但是主要针对UNIX平台(比如Linux,MAC OS),而Windows内核中由于对信号机制的支持不充分,所以在Windows上的Python不能发挥信号系统的功能。signal模块负责python程序内部的信号处理;典型的操作包括信...

weixin_39648469的博客 719

#include「signal.h」

#include<stdio.h> #include<stdlib.h> #include<signal.h> /* signal(参数一,参数二)的用法: 1:参数一:检测到的信号类型 { SIGABRT = 程序异常终止; SIGINT = 用户键盘产生的系统中断 SIGSEGV = 非法访问存储器 } 2:参数二:中断信号的处理方式 { SIG_DFL = 中断默认处理 SIG_IGN = 忽视信号 } .

西红柿炒鸡蛋 1523
上一篇: 工作进展
下一篇: 智能指针之shared_ptr
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值