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

news2024/9/20 5:48:16

       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信号,编译器会首先收到。
        以上函数等的实验程序如下:

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【machine learning-九-梯度下降】

梯度下降 更加通用的梯度下降算法算法步骤 上一节讲过&#xff0c;随机的寻找w和b使损失最小不是一种合适的方法&#xff0c;梯度下降算法就是解决解决这个问题的&#xff0c;它不仅可以用于线性回归&#xff0c;还可以用于神经网络等深度学习算法&#xff0c;是目前的通用性算…

专题六_模拟_算法详细总结

目录 模拟算法 1.模拟算法流程&#xff08;一定要在草稿纸上演算一遍流程&#xff09; 2.把流程转换成代码 1. 替换所有的问号&#xff08;easy&#xff09; 解析&#xff1a; 1.暴力&#xff1a; 2.优化&#xff1a;&#xff08;找规律&#xff09; 总结&#xff1a; …

MySQL数据库迁移与备份实录

这里写目录标题 事情起因的概述查看磁盘空间使用情况为了进一步的明确宕机原因&#xff0c;查看MySQL日志信息进一步排查 如何针对磁盘空间不足进行挂载区域的修改以及数据的迁移与备份分析与梳理如何修改MySQL数据卷的挂载位置停止MySQL服务备份 MySQL 配置文件迁移 MySQL 数据…

MTK zephyr平台:USB升级、枚举流程

一、USB升级流程 通过代码及log分析,当前平台升级过程在PL阶段进行 USB download相关代码 mtk/modules/hal/boot/preloader/platform/flashc/ mtk/modules/hal/boot/preloader/platform/board_name/flash/ mtk/modules/hal/boot/preloader/platform/board_name/src/drive…

【Python报错已解决】ModuleNotFoundError: No module named ‘paddle‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

开放标准如何破解企业数字化与可持续发展的困境:The Open Group引领生态系统架构创新

应对数字化与可持续发展的双重挑战&#xff0c;开放标准是关键 在当今快速变化的商业环境中&#xff0c;企业不仅需要通过数字化转型提升竞争力&#xff0c;还面临日益严格的可持续发展要求。开放标准正在成为企业破解这一双重挑战的核心工具。The Open Group 2024生态系统架构…

智能BI项目第四期

开发图表管理功能 规划思路 首先需要做一个列表页。后端已经在星球提供了一个基础的万能项目模板&#xff0c;包含增删改查接口&#xff0c;我们只需要在此基础上进行定制化开发即可。所以本期后端的开发量不多&#xff0c;只需要复用即可&#xff0c;主要是前端。 规划功能…

【IPV6从入门到起飞】5-4 IPV6+Home Assistant(ESP32+MQTT+ILI9488)远程留言墙

IPV6Home Assistant[ESP32MQTTILI9488]远程留言墙 1 背景2 Home Assistant 配置2-1 配置 yaml2-2 效果 3 ESP32 配置3-1 使用 TFF_eSPI 库3-2 修改默认的SPI屏幕配置文件3-3 接线3-4 ESP32 工程代码 4 测试4-1 留言板设置内容4-2 ESP32 屏幕显示 5 后记 1 背景 在前面我们的几…

自动驾驶中的决策规划技术分享--轻舟智航

文章目录 0.概述&#xff1a;1 导航模块2 决策模块2.1 车道决策2.2 障碍物决策 3 轨迹规划3.1 时空分离规划3.2 时空联合规划 4 对比 0.概述&#xff1a; 李仁杰&#xff0c;轻舟智航规划算法负责人&#xff0c;自动驾驶决策与规划技术专家。 在自动驾驶系统中&#xff0c;决策…

Win10 录屏秘籍大公开:从新手到高手的进阶之路

之前因为某些原因不方便到客户那里进行软件培训&#xff0c;我们就发现录屏讲解供客户随时查看的方式好像更有效果。这次我就介绍一些能够实现win10怎么录屏操作的工具讲解。 1.福昕录屏大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 这个工具是一款专业的电脑录屏软件&a…

SVN泄露 CTFHUB 解题笔记

参考大佬链接CTFHub | SVN泄露_ctfhubsvn泄露-CSDN博客 先下载插件 然后把GIT&#xff1b;里面的代码 乱盘上去 python2 不知道需不需要 先装了 再说。。。我的是裸机~ 开始作妖模式 Ubuntu 22.10 | Installati.one 上面一行的代码 链接 下面 插件 GITHUB页面下面的代码 d…

企业网络安全关键:防御措施和应急响应

感谢浪浪云支持发布 浪浪云活动链接 &#xff1a;https://langlangy.cn/?i8afa52 文章目录 什么是网络安全常见的网络安全威胁病毒和恶意软件网络钓鱼拒绝服务攻击中间人攻击社会工程学 基本的网络安全措施强密码策略双因素认证安装和更新防病毒软件定期备份 高级的网络安全方…

Java-面向对象编程(基础部分)

类和对象的区别和联系 类&#xff1a;类是封装对象的属性和行为的载体&#xff0c;在Java语言中对象的属性以成员变量的形式存在&#xff0c;而对象的方法以成员方法的形式存在。 对象&#xff1a;Java是面向对象的程序设计语言&#xff0c;对象是由类抽象出来的&#xff0c;…

使用 MobaXterm 远程连接 Linux 虚拟机并实现文件传输

文章目录 前言一、什么是 MobaXterm二 、MobaXterm 安装三、使用 MobaXterm 远程连接 Linux 虚拟机1. 准备工作2. 创建 SSH 连接3. 登录虚拟机 四、使用 MobaXterm 进行文件传输总结 前言 在日常开发和运维中&#xff0c;Windows 用户经常需要通过远程连接到 Linux 服务器进行…

链式栈讲解

文章目录 &#x1f34a;自我介绍&#x1f34a;链式栈入栈和出栈linkstack.hlinkstack.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 Hello,大家好&#xff0c;我是小珑也要…

UBUNTU20.04安装CH384串口卡驱动

继续上文&#xff1a;统信UOS安装CH384串口卡驱动-CSDN博客 统信UOS系统成功安装CH384串口驱动后&#xff0c;继续在ubuntu20.04下安装驱动&#xff0c;发现一直报错&#xff0c;原因是内核驱动不一致。 解决办法&#xff1a; 1. 下载最新的驱动。CH35XCH384驱动源文件资源-C…

【WPF】02 按钮控件圆角配置及状态切换

按钮圆角 先从工具箱里拖进来一个Button控件&#xff0c;然后对这个按钮进行美化。 首先在 xaml 里按钮控件部分 添加如下代码&#xff1a; <Button x:Name"btnLogin" Content"登录" HorizontalAlignment"Center" Margin"0,399,0,0&q…

报错合计-1

向开发描述&#xff1a;先勾选一个病灶后复制&#xff0c;控制台报错 报错类型查询后为前端DOM节点相关报错&#xff0c;提给前端开发 报错解释&#xff1a; TypeError: Failed to execute selectNode on Range: parameter 1 is not of type Node 这个错误表明你尝试使用 Range…

【机器学习】:深潜智能的底层逻辑、前沿探索与未来展望】

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 在科技的浩瀚星空中&#xff0c;机器学习犹如一颗璀璨的新星&#xff0c;以其独特的魅力和无限潜力&#xff0c;引领着我们向智能的深处探索。今天&#xff0c;我们将一同踏上这场深度之旅&#xff0c;不仅解析…

AI时代,服务器厂商能否打破薄利的命运?

文&#xff5c;刘俊宏 编&#xff5c;王一粟 AI大模型正在引发新一轮的“算力焦渴”。 近日&#xff0c;OpenAI刚发布的o1大模型再次刷新了大模型能力的上限。对比上一次迭代的版本&#xff0c;o1的推理能力全方位“吊打”了GPT-4o。更优秀的能力&#xff0c;来自与o1将思维…