C语言从头学61——学习头文件signal.h

signal.h 提供了信号(即异常情况)的处理工具。所谓"信号"可以理解为系统与程序之间的沟通消息,用来处理运行时的错误及异常事件。

一、signal.h 定义的表示运行错误或异常的宏:

SIGABRT:异常中止(调用了abort函数)

SIGFPE:算术运算发生了错误(0做除数或者溢出)

SIGILL:无效指令

SIGINT:中断(由按下Ctrl-C发出)

SIGSEGV:无效内存访问

SIGTERM:终止请求

二、函数 signal()

功能:用来指定某种信号的处理函数,这个函数也是在头文件signal.h中定义的。

使用格式:signal(参1,参2);

参1:代表信号的宏

参2:处理这个信号的函数指针(返回值为void带有int参数的函数)

返回值:返回值上一个处理函数的指针。

说明:

a. 信号处理函数内部可以根据传入的int参数,判断接收到了什么信号并进行处理。一般处理函数执行完成,程序会从信号发生点恢复执行。

b. 处理函数的返回值一般把它保存在变量之中,当新的处理函数执行完,再恢复以前的处理函数。

三、与信号处理函数相关的宏

SIG_DFL 表示默认的处理函数 例如:signal(SIGINT, SIG_DEL); //表示用系统默认信号处理函数处理中断信号

SIG_IGN 表示忽略该信号 例如:signal(SIGINT, SIG_IGN); //表示忽略中断信号(不处理)

SIG_ERR 是信号处理函数自身发生错误时的返回值,使用它可以判断信号处理函数是否正常

四、函数raise()

功能:用来在程序中发出信号,这个函数也是在signal.h中定义的。

使用格式:raise(参1);

参1:int型数(这个int型数值就是信号值,也就是前面系统定义的宏)

返回值:信号发出成功返回0;失败返回非0数。

五、总结

a. signal函数的作用是将信号与处理程序关联,raise的作用是发出信号,这两个函数

要成对使用;

b. 信号发到我们自己编写的信号处理程序,包括SIGINT运行完后都会返回到主程序;但

使用缺省信号处理程序,处理完上述信号后,不再回到主程序,直接结束。

c. 如果使用Ctr-C发出SIGINT信号,编译器会首先收到。

以上函数等的实验程序如下:

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<signal.h>
#include<Windows.h>
//自定义信号处理程序
void handle(int x) 
{
	printf("进入信号处理函数\n");
	printf("接收到信号的值是:%i\n", x);
	printf("按回车键继续...\n");
	getchar();
}
int main(void)
{
//实验SIGINT信号
	void* oldP=signal(SIGINT, handle);
	    //signal函数关联信号SIGINT和信号处理程序handle
	    //并接收signal函数的返回值
	if(raise(SIGINT)== SIG_ERR)printf("raise函数运行错误...\n");
	    //调用raise函数发出SIGINT信号并判断是否发送成功
	signal(SIGINT, oldP);
	    //恢复signal原始处理函数
	printf("已经回到主程序(1)...\n");
//实验SIGFPE信号
	signal(SIGFPE, handle);
	  //关联信号SIGFPE与信号处理程序handle
	printf("请输入一个除数:\n");
	int a;	
	scanf("%i", &a);
	if (a == 0) //输入的数如果是0,则进入信号处理函数
	{

		raise(SIGFPE,handle);
		  //发出SIGFPE信号
	}
	printf("已经回到主程序(2)...\n");
	getchar();
//实验SIGABRT信号
	signal(SIGABRT, handle);
	    //关联信号SIGABRT与信号处理程序handle
	raise(SIGABRT);
	    //发出SIGABRT信号
    printf("已经回到主程序(3)...\n");
	getchar();
//实验缺省处理程序
	signal(SIGTERM,SIG_DFL);
	    //关联信号SIGTERM与缺省信号处理程序
	raise(SIGTERM);
	    //发出SIGTERM信号
	    //缺省处理程序运行结束,程序即结束,不会再回到主程序
	printf("已经回到主程序(4)...\n");
	    //这一语句及后边语句不会执行
	getchar();
	return 0;
}
相关推荐
march_birds2 小时前
FreeRTOS 与 RT-Thread 事件组对比分析
c语言·单片机·算法·系统架构
小麦嵌入式2 小时前
Linux驱动开发实战(十一):GPIO子系统深度解析与RGB LED驱动实践
linux·c语言·驱动开发·stm32·嵌入式硬件·物联网·ubuntu
jelasin3 小时前
LibCoroutine开发手记:细粒度C语言协程库
c语言
篝火悟者4 小时前
自学-C语言-基础-数组、函数、指针、结构体和共同体、文件
c语言·开发语言
神里流~霜灭5 小时前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
双叶8365 小时前
(C语言)单链表(1.0)(单链表教程)(数据结构,指针)
c语言·开发语言·数据结构·算法·游戏
艾妮艾妮6 小时前
C语言常见3种排序
java·c语言·开发语言·c++·算法·c#·排序算法
charlie1145141917 小时前
STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出
c语言·stm32·单片机·嵌入式硬件·gpio·数据手册
矿渣渣7 小时前
int main(int argc, char **argv)C语言主函数参数解析
c语言·开发语言
阿让啊7 小时前
bootloader+APP中,有些APP引脚无法正常使用?
c语言·开发语言·stm32·单片机·嵌入式硬件