信号及信号处理

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

信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式。在

Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给

进程传递数据。

一、信号的来源

    信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种。

1、 硬件方式

    当用户在终端上按下某键时,将产生信号。如按下组合键后将产生一个SIGINT信号。

硬件异常产生信号:除数据、无效的存储访问等。这些事件通常由硬件(如:CPU)检测到,并将其通知给Linux

操作系统内核,然后内核生成相应的信号,并把信号发送给该事件发生时正在进行的程序。

2、 软件方式

用户在终端下调用kill命令向进程发送任务信号。

进程调用kill或sigqueue函数发送信号。

当检测到某种软件条件已经具备时发出信号,如由alarm或settimer设置的定时器超时时将生成SIGALRM信号。

1、可靠信号与不可靠信号

    在Linux系统中,信号的可靠性是指信号是否会丢失,或者说该信号是否支持排除。SIGHUP( 1 ) ~ 

SIGRTMIN(33) ~ SIGRTMAX(64)之间的信号,它们都是可靠信号,也称为实时信号。

内核设置了这个标志,我们就说内核向一个进程递送了一个信号。信号产生(generate)和递送(delivery)之间

的时间间隔,称主信号未决(pending)。

    进程可以调用sigpending将信号设为阻塞,如果为进程产生一个阻塞信号,而对信号的动作是捕捉该信号(即不忽

略信号), 则内核将为该进程的此信号保持为未决状态,直到该进程对此信号解除阻塞或者对此信号的响应

更改为忽略。如果在进程解除对某个信号的阻塞之前,这种信号发生 了多次,那么如果信号被递送多次(即

信号在未决信号队列里面排队),则称之为可靠信号;只被递送一次的信号称为不可靠信号。

2、信号的优先级

    信号实质上是软中断,中断有优先级,信号也有优先级。如果一个进程有多个未决信号,则对于同一个未决的

实时信号,内核将按照发送的顺序来递送信号。如果存在多个未决信号,则值(或者说编号)越小的越先被递送。

如果即存在不可靠信号,又存在可靠信号(实时信号),虽然POSIX对这一情况没有明确规定,但Linux系统

和大多数遵循POSIX标准的操作系统一样,将优先递送不可靠信号。

三、进程对信号的响应

当信号发生时,用户可以要求进程以下列3种方式之一对信号做出响应。

1、  捕捉信号:对于要捕捉的信号,可以为其指定信号处理函数,信号发生时该函数自动被调用,在该函数内部实

现对该信号的处理。

2、  忽略信号:大多数信号都可使用这种方式进行处理,但是SIGKILL和SIGSTOP这两个信号不能被忽略,同时

这两个信号也不能被捕获和阻塞。此外,如果忽略某某些由硬件异常产生的信号(如非法存储访问或除以0),

则进程的行为是不可预测的。

3、  按照系统默认方式处理。大部分信号的默认操作是终止进程,且所有的实时信号的默认动作都是终止进程。

四、各种信号的默认处理情况

程序不可捕获、阻塞或忽略的信号有:SIGKILL,SIGSTOP

不能恢复至默认动作的信号有:SIGILL,SIGTRAP

默认会导致进程流产的信号有:SIGABRT、SIGBUS、SIGFPE、SIGILL、SIGIOT、SIGQUIT、SIGSEGV、

SIGTRAP、SIGXCPU、SIGXFSZ

默认会导致进程退出的信号有:SIGALRM、SIGHUP、SIGINT、SIGKILL、SIGPIPE、SIGPOLL、SIGPROF、

SIGSYS、SIGTERM、SIGUSR1、SIGUSR2、SIGVTALRM

默认会导致进程停止的信号有:SIGSTOP、SIGTSTP、SIGTTIN、SIGTTOU

默认进程忽略的信号有:SIGCHLD、SIGPWR、SIGURG、SIGWINCH

五、信号处理函数与相关结构

1.信号安装

1.signal() 
    include 

    void (*signal(int signum, void (*handler))(int)))(int); 

    如果该函数原型不容易理解的话,可以参考下面的分解方式来理解: 

    typedef void (*sighandler_t)(int); 

    sighandler_t signal(int signum, sighandler_t handler)); 

    第一个参数指定信号的值,第二个参数指定针对前面信号值的处理,可以忽略该信号(参数设为SIG_IGN);

可以采用系统默认方式处理信号(参数设为SIG_DFL);也可以自己实现处理方式(参数指定一个函数地址)。 

    如果signal()调用成功,返回最后一次为安装信号signum而调用signal()时的handler值;失败则返回

SIG_ERR。



2.sigaction() 
#include 

int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact));

sigaction函数用于改变进程接收到特定信号后的行为。该函数的第一个参数为 信号的值,可以为除SIGKILL及

SIGSTOP外的任何一个特定有效的信号(为这两个信号定义自己的处理函数,将导致信号安装错误)。第二

个参数是指 向结构sigaction的一个实例的指针,在结构sigaction的实例中,指定了对特定信号的处理,可

以为空,进程会以缺省方式对信号处理;第三个 参数oldact指向的对象用来保存原来对相应信号的处理,可

指定oldact为NULL。如果把第二、第三个参数都设为NULL,那么该函数可用于检查 信号的有效性。

2、发送信号函数
(1) int raise(int sig); 对当前进程发送指定信号

       (2) int pause(void);  将进程挂起等待信号

       (3) int kill(pid_t pid,int sig); 通过进程编号发送信号

       (4) unsigned int alarm(unsigned int seconds); 指定时间(秒)发送SIGALRM信号。

 seconds 为0 时取消所有已设置的alarm请求;

       (5)int sigqueue(pid_t pid,int sig,const union sigval val);类似于kill函数,多了附

带共用体 union sigval形数,将共用体中的成员 int sival_int 或 void *sival_ptr 的值传递给 信

号处理函数中

的定义类型 siginfo_t 中的 int si_int 或 void *si_ptr;

       (6)int setitimer(int which,const struct itimerval *value,struct itimerval 

*oldvalue);  可定时发送信号,根据which可指定三种信号类型:SIGALRM、SIGVTALRM 和 SIGPROF;作

用

时间也因which值不同而不同;struct itimerval 的成员 it_interval定义间隔时间,it_value 为0

时,使计时器

失效;

       (7) void abort(void) 将造成进程终止;除非捕获SIGABORT信号;  

3、信号集及信号集操作

sigfillset(sigset_t *set); 设置所有的信号到set信号集中;

sigemptyset(sigset_t *set); 从set信号集中清空所有信号;

sigaddset(sigset_t *set,int sig);在set信号集中加入sig信号;

sigdelset(sigset_t *set,int sig);在set信号集中删除sig信号;

4、阻塞信号相关函数

              int sigprocmask(int how,const sigset_t *set,sigset_t *set);  根据how

值,设置阻塞信号集,或释放阻塞的信号集

              int sigpending(sigset_t *set); 获取在阻塞中的所有信号;

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

相关推荐

Python信号处理

SIGKILL信号是无法在程序内部捕获的,一旦发送SIGKILL信号给进程,Linux就将进程停止在那里。Python自己并不检查SIGKILL,而是直接把底层标准C的运行时错误返回。

王二的专栏 5186

信号产生到触发过程

1.信号是怎么产生的? 可以由内核,进程产生 2.信号怎么发送到进程? 2.1.发送进程->内核 所有信号都需要通过内核发送,内核在收到信号后会对其参数进行检测(这个进程能不能发送这个信号…)。校验通过后,将信号数据(信号值,产生原因,发送者进程ID)拷贝到内核空间.然后再发送给对应的进程。 2.2.内核到->接受进程 早期UNIX版本,进程保存了一份未处理信号的位图。当内核发送信号到进程时,先检测进程是否对该信号未处理,时则丢弃当前信号。这样的信号称为不可靠信号。不可靠信号每次执行完都会恢复默

德玛西亚的专栏 561

信号和信号处理

1. 信号的基础        信号时一种常用的Linux进程间的通信方式,用户进程使用的Linux命令中有许多包含对信号的处理。深入讨论常用的Linux信号时有必要的,可以通过查询帮助文档的方式查询。 1.1 信号的基本概念        信号时一种进程通信的方式,又称为软中断,一个进程一旦收到信号就会打断原来的程序执行流程来处理该信号。由于进程不知道你是否收到信号

xiao_ma123的专栏 1727

Linux 信号signal处理机制

 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。 一、信号的基本概念 本节先介绍信号的一些基本概念,然后给出一些基本的信号类型和

tellyouatruth的专栏 3076

Kill5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题

Kill5-5.37版本下,使用ARMcomplier6编译__asm 函数报错的问题 问题简要描述: 昨日更新了keil5软件的版本,从5.17更新到了5.37版本,然后编译STM32项目文件时,软件提示编译报错。报错问题如下: Build started: Project: QKsoftware *** Using Compiler 'V6.18', folder: 'E:\MDK-ARM\ARM\ARM\ARMCLANG\Bin' Build target 'QKsoftware' compiling

weixin_43644424的博客 1万+

到底是什么决定了二极管的最高工作频率?

硬件工程师,应该都用过二极管的吧,不过也许有一个误区,大多数人可能并不知道,或者说是理解有问题,下面就来细细说下。 一个问题 先提一个问题:到底是什么决定了二极管的最高工作频率? 估计有不少人会回答是二极管反向恢复时间Trr,也有人会说是二极管结电容,那到底谁是对的呢?或者说都一样,反向恢复时间由结电容决定? 到底什么决定了二极管的最高工作频率,我们暂且不论,不过需要知道的是,二极管的反向恢复时间和结电容根本就是两回事,反向恢复时间绝不能等同于结电容的充放电时间。 为什么我这么说呢?.

weixin_42005993的博客 4832

信号处理入门

1、基本概念 周期: 每个循环的时长,如上图,周期约为2.3ms 频率: 即周期的倒数,其单位为每秒钟循环数,也称为赫兹(Hz),上图的型号频率大约为1/2.3*1000 = 439Hz 波形:周期信号的形状

Haward 1万+

手把手教你用TP4056和PMOS管搭建锂电池自动切换电路(含元器件选型指南)

本文详细介绍了如何使用TP4056和PMOS管搭建锂电池自动切换电路,包括核心架构设计、元器件选型指南和PCB布局优化。通过智能充电算法和电源路径切换模块,实现外部供电与锂电池的无缝切换,提升便携式设备的电源管理效率。

julia4scientist的博客 888

信号处理知识

相移键控是一种数字调制方法。这种方法用于通过调制否则会改变被称为参考信号的载波信号的相位来传输数据。通过使用有限数量的单独信号,可以用任何一种数字调制方法来表示数字数据。这种调制方法使用有限数量的相位,其中每个相位都可以分配二进制数字。通常,每个阶段都编码相等数量的位。每个位模式形成由确切相位表示的符号。

weixin_42003842的博客 4044

【ArcGIS Pro微课1000例】0023:ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)

本文讲解ArcGIS Pro 3.0中打开GeoPackage数据库(.gpkg)的两种方法。

智慧空间实验室 4641

手把手完整实现STM32+ESP8266+MQTT+阿里云服务器+手机APP应用——第一节—阿里云物联网平台配置+IoTStudio界面绘制+MQTT.fx模拟MQTT客户端与使用AT命令发布订阅消息

通过MQTT.fx模拟连接以及通过CH340串口连接ESP8266发送AT命令,实现阿里云物联网平台发送数据同时接收数据,IOT studio界面显示数据。具体来说:使用ESP8266(本系列使用了ESP8266-ESP01/01S以及正点原子的ATK-ESP8266) 来连接网络,获取设备数据发送到阿里云物联网平台并显示数据,通过IOT studio界面显示数据并发送命令控制设备。本系列使用的主控芯片是STM32F103系列,当然也可以使用其他系列单片机都可以实现,思路都是一样的。同时本系列有手机APP源

嵌入式阿齐Archie 5万+

python信号处理教程_Python信号处理

python信号处理教程Welcome to python signal processing tutorial. This is going to be a very basic lesson on how to handle signals with python. A computer receives and transmits various commands with the help...

从零开始的教程世界 5774

RFC-only 与 SAProuter 场景下,让 Claude 真正参与 SAP ABAP 开发

SAP ABAP 开发这几年正在出现一个很有意思的变化。过去我们说开发工具,脑子里大多是 SE80、SE38、SE24、SEGW、Eclipse ADT,再往后是 BAS、VS Code、abapGit、ATC、CI/CD。现在又多了一层,Claude Code、Claude Desktop 这类 AI 编程助手开始通过 MCP 进入开发现场,不只是写一段示例代码,而是能读系统里的 ABAP 对象、搜索包、改源码、跑检查、辅助重构。

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

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

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

2401_86402545的博客 1505

C#串口通信从入门到精通(1)——硬件接线

RS-232接口一般都是9针的,有公母头(针头和孔头),为了便有理解以下都称为针头和孔头,针头就是露出来的针,孔头就是9个孔,总共使用3条线进行通信,一条用于发送,一条用于接收,另外一根是GND地线,由于线路的功能是永久性的,设置连接时,必须确保一个节点的发送线与另一个节点的接收线相连,反之亦然,RxD(PC的接收线)连接到TxD(传感器电子设备的发送线),TxD(PC的发送线)连接到RxD(传感器电子设备的发送线)。两条线路的电平都是相对于GND的。因此,GND也必须连接,但不能将GND与屏蔽连接。

qq_34059233的博客 1万+

AI Agent开发大全第二十课-如何开发一个MCP(从0开发一个MCP Server)

大模型的MCP火了,可是无论是Claude官网本身自带Sample还是全网任何一本教程没有一个可以真正应用在生产环境中的。要么就是只能在本地以文件IO流的方式运行要么干脆连编译都出错,真正的mcp server和client是怎么编写的?如何运行在分布式环境?本教程就带大家真正从0开始以“AI计算食物热量“为例带大家真正学习mcp开发的全过程。

打造全国最全的AI Agent开发知识领域的博客 1802

Unix信号处理

 信号是传送给进程的一种事件通知,生成信号的事件有三大类:1.       程序错误:除零,非法内存访问…2.       外部信号:终端Ctrl-C产生SGINT信号,定时器到期产生SIGALRM…3.       显示请求:kill函数允许进程发送任何信号给其他进程或进程组。信号生成既可以是同步的(信号与程序中的某个具体操作相关并在那个操作同时产生),也可以是异步的。通常程序错

kingmax26的专栏 1379

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

信号处理详解

在我们的生活中到处都可以看见信号,比如:烽火戏诸侯、飞鸽传书、古希腊马拉松送捷报,现在的QQ、微信、还有你被crush拉黑的哥谭感叹号等等等。那么,在我们计算机体系中,信号是如何产生、发送和处理的呢?信号的整个生命周期:信号产生、信号保存、信号处理。本文,将会详细介绍信号是什么。在操作系统中,一共有31个普通信号信号处理:默认动作、忽略动作、自定义处理---信号捕捉进程处理信号,都是默认的---默认动作通常指向终止自己 / 暂停 / 忽略信号的记录。

qq_51216031的博客 1715

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux进程信号【信号处理】_linux 信号处理

搞清楚。

2401_86358687的博客 922

Perl信号处理

本文关于Perl信号处理的内容主体来自于《Pro Perl》的第21章。 信号处理 操作系统可以通过信号(signal)处理机制来实现一些功能:程序注册好待监视的信号处理机制,在程序运行过程中如果产生了对应的信号,则会按照注册好的处理方式进行处理。 signal基础 每个进程都记录了一个信号(signal)索引表,并注册了各种信号的处理方式,每当收到信号的时候,会立即停止执行操作并处理对应的信号。...

weixin_30653097的博客 529

【Linux信号处理】

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

electronic_J的博客 1426

信号处理方法概述

语音信号处理流程示例 本示例展示语音信号从生成到识别的完整处理流程,包含以下关键步骤: 信号生成:模拟500Hz和1500Hz双音调语音,添加高斯噪声 时频分析:通过FFT和STFT观察信号频谱特征 滤波去噪:设计带通滤波器(300-2000Hz)消除噪声 特征提取:计算MFCC系数作为语音特征 模式识别:使用简单分类器进行音调识别 # 核心代码片段 import numpy as np import librosa # 1. 信号生成 t = np.linspace(0, 1, 16000) signal

金石软件 1208

python在信号处理的应用_Python和信号处理程序

我需要一些关于python中的信号处理程序的澄清,因为我不确切地理解它们是如何工作的、如何使用它们以及有哪些限制。在我打算在linux上使用USR信号,以便与作为服务在后台运行的python程序通信。在我发现,正如预期的那样,我发送的信号似乎是以异步方式立即处理的。在因此,我过去认为注册的信号处理程序在它们自己的线程中运行,我想这可以解释为什么在循环中发送信号时,下面的代码会同时打印多行Signa...

weixin_39965283的博客 522
上一篇: .c和.h文件的区别(头文件与之实现文件的的关系~ )
下一篇: signal信号和sigaction信号处理机制
FallingU
博客等级 码龄11年 61粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值