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

#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.mfbz.cn/a/879728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法 | 灵神题单 | 合并链表篇】力扣2, 21, 445, 2816

1. 力扣2&#xff1a;两数相加 1.1 题目&#xff1a; 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可…

黑神话悟空mac可以玩吗

黑神话悟空mac上能不能玩对于苹果玩家来说很重要&#xff0c;那么黑神话悟空mac可以玩吗&#xff1f;目前是玩不了了&#xff0c;没有针对ios系统的版本&#xff0c;只能之后在云平台上找找了&#xff0c;大家可以再观望下看看。 黑神话悟空mac可以玩吗 ‌使用CrossOver‌&…

JavaEE初阶——初识EE(Java诞生背景,CPU详解)

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯&#xff0c;你们的点赞收藏是我前进最大的动力&#xff01;&#xff01;希望本文内容能帮到你&#xff01; 目录 零&#xff1a;Java的发展背景介绍 一&#xff1a;EE的概念 二&#xff1a;计算机的构成 1&#xff1a;CU…

TCP 拥塞控制:一场网络数据的交通故事

从前有条“高速公路”&#xff0c;我们叫它互联网&#xff0c;而这条公路上的车辆&#xff0c;则是数据包。你可以把 TCP&#xff08;传输控制协议&#xff09;想象成一位交通警察&#xff0c;负责管理这些车辆的行驶速度&#xff0c;以防止交通堵塞——也就是网络拥塞。 第一…

你知道企业架构中核心的4大架构联系和不同吗?

引言&#xff1a;企业架构是指对企业信息管理系统中具有体系的、普遍性的问题而提供的通用解决方案它是基于业务导向和驱动的架构来理解、分析、设计、构建、集成、扩展、运行和管理信息统的。复杂系统是基于架构(或体系)的集成&#xff0c;而不是基于部件(或组件)的集成。指导…

【ARM】中断的处理

ARM的异常向量表 如果发生异常后并没有exception level切换&#xff0c;并且发生异常之 前使用的栈指针是SP_EL0&#xff0c;那么使用第一组异常向量表。如果发生异常后并没有exception level切换&#xff0c;并且发生异常之 前使用的栈指针是SP_EL1/2/3&#xff0c;那么使用第…

支付宝开发者✖️「蚂小财」——AgentUniverse专业多智能体框架在严谨产业中的应用实践

正在直播&#xff1a;点击进入直播间互动拿蚂蚁保温杯 &#xfeff;直播&#xfeff; &#xfeff;

英飞凌最新AURIX™TC4x芯片介绍

概述: 英飞凌推出最新的AURIX™TC4x系列,突破了电动汽车、ADAS、汽车e/e架构和边缘应用人工智能(AI)的界限。这一代面向未来的微控制器将有助于克服安全可靠的处理性能和效率方面的限制。客户将可缩短快速上市时间并降低整体系统成本。为何它被称为汽车市场新出现的主要颠覆…

828华为云征文 | 华为云Flexusx与Docker技术融合,打造个性化WizNote服务

前言 华为云Flexus X实例携手Docker技术&#xff0c;创新融合打造高效个性化WizNote服务。华为云Flexus X实例的柔性算力与Docker的容器化优势相结合&#xff0c;实现资源灵活配置与性能优化&#xff0c;助力企业轻松构建稳定、高效的云端笔记平台。828华为云企业上云节特惠来袭…

[2025]医院健康陪诊系统(源码+定制+服务)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Element UI入门笔记(个人向)

Element UI入门笔记 将页面分割为一级菜单、二级菜单、导航栏三个部分&#xff1b;使用npm下载安装&#xff0c;使用语句npm i element-ui -s; 布局组件 el-form 用于创建和管理表单&#xff1b;从属性上看&#xff1a; :model&#xff1a;用于双向数据绑定&#xff0c;将表单…

Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)

题目&#xff1a;*18.29(某个目录下的文件数目) 编写一个程序&#xff0c;提示用户输入一个目录&#xff0c;然后显示该目录下的文件数。 和上一题(18.28)的思路差不多&#xff0c;把找到文件后累加大小到变量变成计数1即可。 Java语言程序设计基础篇_编程练习题*18.28 (非递…

Linux(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑)&#xff0c;然后C盘、D盘。 Linux系统的根目录是/&#xff0c;我们可以使用cd /进入根目录&#xff0c;然后使…

《深入理解JAVA虚拟机(第2版)》- 第12章 - 学习笔记

第12章 Java内存模型与线程 12.1 概述 TPS是用来衡量一个服务性能好坏高低的重要指标值。TPS是Transactions Per Second的缩写&#xff0c;用来表示每秒事务处理数&#xff0c;即服务端每秒平均能碰响应的请求数。 12.2 硬件的效率与一致性 处理器与内存的运算效率差了好几…

关于STM32项目面试题02:ADC与DAC篇(输入部分NTC、AV:0-5V、AI:4-20mA和DAC的两个引脚)

博客的风格是&#xff1a;答案一定不能在问题的后面&#xff0c;要自己想、自己背&#xff1b;回答都是最精简、最精简、最精简&#xff0c;可能就几个字&#xff0c;你要自己自信的展开。 面试官01&#xff1a;什么是模数转换/ADC&#xff1f;说说模数转换的流程&#xff1f; …

数字自然资源领域的实现路径

在数字化浪潮的推动下&#xff0c;自然资源的管理与利用正经历着前所未有的变革。本文将从测绘地理信息与遥感专业的角度&#xff0c;深度分析数字自然资源领域的实现路径。 1. 基础数据的数字化 数字自然资源的构建&#xff0c;首先需要实现基础数据的数字化。这包括地形地貌…

【速成Redis】02 Redis 五大基本数据类型常用命令

前言&#xff1a; 上一节课&#xff0c;我们对redis进行了初步了解&#xff0c;和安装好了redis。【速成Redis】01 Redis简介及windows上如何安装redishttps://blog.csdn.net/weixin_71246590/article/details/142319358?spm1001.2014.3001.5501 该篇博客&#xff0c;我们正…

八股文-JVM

是什么&#xff1f;有什么用&#xff1f;谁发明的&#xff1f;什么时候发明的&#xff1f; Java虚拟机&#xff0c;用来运行Java程序&#xff0c;有很多个版本的虚拟机&#xff0c;比如HotSpot&#xff0c;最开始是SUN公司开发人员&#xff0c;和Java一起发布&#xff0c;现在…

9. 什么是 Beam Search?深入理解模型生成策略

是不是总感觉很熟悉&#xff1f;Beam Search 是生成任务中常用的一种方法。 在之前第5&#xff0c;7&#xff0c;8篇文章中&#xff0c;我们都曾经用到过与它相关的参数&#xff0c;而对于早就有着实操经验的同学们&#xff0c;想必见到的更多。这篇文章将从示例到数学原理和代…

【C语言二级考试】循环结构设计

C语言二级考试——循环结构程序设计 五.循环结构程序设计 1.for循环结构 2.while和do-while循环结构 3.continue语句和break语句 4.循环的嵌套 知识点参考【C语言】循环-CSDN博客 文章目录 1.for循环2.while和do-while循环结构3.continue语句和break语句4.循环的嵌套 1.for循环…