013_C标准库函数之<signal.h>

2024-04-18 15:44
文章标签 signal 标准 013 库函数

本文主要是介绍013_C标准库函数之<signal.h>,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?
同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。

信号是UNIX和Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。
但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获

以上是我觉得说的还不错的关于信号的诠释,当然了,如果要刨根问底的话,那这些描述就太简单了,但是我们的主要目标是使用signal函数并操作信号,关于信号产生的背景这里不做过多探讨,有兴趣的朋友可以自问度娘,下来我们直入主题:

首先,我们这里着重介绍一下signal函数

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

这个函数看起来非常复杂,其实剖析开看,是这样的:里面是signal(int sig, void (*handle)(int)),就是一个signal函数,第一个入参为一个int类型的sig,第二个入参为void (int)类型的函数指针(关于函数指针和指针函数不懂的,可以参考我前面的文章:000_函数指针和指针函数?-CSDN博客),其实就是准备捕获的信号的参数由sig给出,接收到的指定信号后要调用的函数由参数handle给出,接下来再看外面的函数:我们把signal看作一个整体T,外面的函数形式就是void (*T)(int);该函数返回一个与handle相同类型的指针,指向先前指定信号处理函数的函数指针(请仔细品味这句话)

注意信号处理函数的原型必须为void func(int)因为函数指针定义是void (*handle)(int);

其次,我们再看看信号表:

我们可以看到有64个信号,这里我们不一一说明,只是说一下比较常用的信号值及其含义:

SIG_ 宏与 signal 函数一起使用来定义信号的功能。

宏 & 描述
SIG_DFL
默认的信号处理程序。
SIG_ERR
表示一个信号错误。
SIG_IGN
忽视信号。

SIG 宏用于表示以下各种条件的信号码:

宏 & 描述
SIGABRT
程序异常终止。
SIGFPE
算术运算出错,如除数为 0 或溢出。
SIGILL
非法函数映象,如非法指令。
SIGINT
中断信号,如 ctrl-C。
SIGSEGV
非法访问存储器,如访问不存在的内存单元。
SIGTERM
发送给本程序的终止请求信号。

【函数1:signal 】


【格式】

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)。如果从信号处理程序中返回,则从中断的位置继续执行。

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

【入参】

int sig:信号,比如SIGINT,SIGKILL等

void (*handler)(int)):函数指针原型,就是void (int)函数

【返回值】

void(*)(int);一个函数指针类型的返回值

【test_code】

直接调用:

挂钩调用:

创建类型对象调用:

以上都是调用的方法,其实都大同小异,不过我还是建议使用最后一个方法比较好一些

【总结】

signal函数的的入参就是信号,函数指针,所以可以理解此函数就是捕捉到相应的信号后,然后直接跳到函数指针处对信号进行进一步的处理,那么处理完后会不会继续回来处理程序呢?从我们的案例当中可以看到是直接结束了,因为我们捕捉的是"ctrl+c"信号:退出程序,我试了其他几个信号,也不行,捕捉到信号后,直接到信号处理函数运行,运行完后直接退出,这个到底是不继续回来处理函数?还是说就直接终止了呢?还需要探究,我尚不能给出定论,有知道的大牛可以麻烦告知我下,小弟在这里谢过了^-^

【函数2:raise 】


【格式】

int raise(int sig)

【功能】

促使生成信号 sigsig 参数与 SIG 宏兼容

【入参】

  • sig -- 要发送的信号码。下面是一些重要的标准信号常量:
信号
SIGABRT(Signal Abort) 程序异常终止。
SIGFPE(Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。
SIGILL(Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。
SIGINT(Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。
SIGSEGV(Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。
SIGTERM(Signal Terminate) 发送给本程序的终止请求信号。

【返回值】

如果成功该函数返回零,否则返回非零

【test_code】

发送SIGINT

发送SIGTERM

【总结】

raise是发送一个信号给当前进程,需要用signal函数去捕获,然后将捕获到的信号用函数指针callfptr处理,但是,如果是终止或者异常终止等信号请求,则实际直接回终止当前进程的运行,并不会再去回调函数指针

关于信号的应用及扩展,在Linux中有大量的描述,以及sigaction等功能强大的函数,这个有兴趣的可以去看看,后面我们也会在Liunx C模块中去讲解这些,当然了,本人还是觉得先把C的这些搞清楚,因为linux C是在C的基础之上去搞的,切勿好高骛远哦,一步步来,加油,一起共勉

这篇关于013_C标准库函数之<signal.h>的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/915192

相关文章

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

C 标准库 - `<float.h>`

C 标准库 - <float.h> 概述 <float.h> 是 C 标准库中的一个头文件,它定义了与浮点数类型相关的宏。这些宏提供了关于浮点数的属性信息,如精度、最小和最大值、以及舍入误差等。这个头文件对于需要精确控制浮点数行为的程序非常有用,尤其是在数值计算和科学计算领域。 主要宏 <float.h> 中定义了许多宏,下面列举了一些主要的宏: FLT_RADIX:定义了浮点数的基数。

《C++标准库》读书笔记/第一天(C++新特性(1))

C++11新特性(1) 以auto完成类型自动推导 auto i=42; //以auto声明的变量,其类型会根据其初值被自动推倒出来,因此一定需要一个初始化操作; static auto a=0.19;//可以用额外限定符修饰 vector<string> v;  auto pos=v.begin();//如果类型很长或类型表达式复杂 auto很有用; auto l=[] (int

标准IO与系统IO

概念区别 标准IO:(libc提供) fopen fread fwrite 系统IO:(linux系统提供) open read write 操作效率 因为内存与磁盘的执行效率不同 系统IO: 把数据从内存直接写到磁盘上 标准IO: 数据写到缓存,再刷写到磁盘上

2024年 Biomedical Signal Processing and Control 期刊投稿经验最新分享

期刊介绍 《Biomedical Signal Processing and Control 》期刊旨在为临床医学和生物科学中信号和图像的测量和分析研究提供一个跨学科的国际论坛。重点放在处理在临床诊断,患者监测和管理中使用的方法和设备的实际,应用为主导的研究的贡献。 生物医学信号处理和控制反映了这些方法在工程和临床科学的界面上被使用和发展的主要领域。期刊的范围包括相关的评论论文(review p

通信工程学习:什么是AM标准调幅

AM标准调幅       AM标准调幅,即Amplitude Modulation(振幅调制),是一种在电子通信中广泛使用的调制方法,特别是在无线电载波传输信息方面。以下是关于AM标准调幅的详细解释: 一、AM标准调幅的定义与原理 AM标准调幅的定义:        AM调幅是通过改变载波信号的振幅(即信号强度或电压幅度),使其与信息信号(如音频、视频等)同步变化,从而实现信息的传

【电子通识】洁净度等级划分及等级标准

洁净度常用于评估半导体、生物制药、医疗、实验室及科研院所、新能源等领域的洁净室、无尘室或者无菌室等环境。         一般来说,晶圆光刻、制造、测试等级为100级或1000级的洁净间,百级洁净间要求空气中0.5微米的尘埃粒子数不得超过每立方米3520个;等级为1000级的洁净间要求0.5微米的尘埃粒子数不得超过每立方米35200个。         晶圆切割或封装工序一

标准库标头 <filesystem> (C++17)学习

此头文件是文件系统支持库的一部分。本篇介绍filesystem命名空间的一些函数。 函数 在命名空间 std::filesystem 定义 absolute (C++17) 组成一个绝对路径 (函数) canonicalweakly_canonical (C++17) 组成一个规范路径 (函数) relativeproximate (C++17) 组成一个相对路径 (函数) copy (C

搭建服务器机房的标准是什么?

企业在进行选择服务器时,可能会将服务器放置公司,但是大多数企业还是会选择服务器租用或托管服务,因为专业的IDC服务商通常能够提供良好的机房环境来进行放置服务器,接下来小编就主要来介绍一下搭建服务器机房的标准都有哪些吧! 首先对于机房的位置选择要保证原理水源、油库和化工厂等危险的场所,并且不应该建设在容易受到水灾和地震等自然灾害影响的地区当中,防止出现不可遏制的情况发生,造成重大的经济损失。

将中国标准时间转换为年月日时分秒格式

1.将中国标准时间转换为年月日时分秒格式 代码如下(示例): // 时间格式化timestampToTime(timestamp) {var chinaStandard=Mon Jul 19 2021 11:11:55 GMT+0800 (中国标准时间);var date = new Date(chinaStandard);var y = date.getFullYear();var m =