C语言信号处理

17 篇文章 0 订阅

C语言信号处理

一个外部的异步事件或者信号,能够引起程序提前结束。常见的时间有:中断(在Linux、UNIX或者Windows系统中键入组合键Ctrl+c,在OS X系统中键入组合键command+c)和来自操作系统的终端命令。
信号处理函数库(signal.h)提供了基于函数signal的捕获异常事件能力。
函数signal接收两个实参——整型的信号编号和指向相应的信号处理函数的指针。信号可以通过函数raise来产生,该函数接收一个整型的信号编号作为实参。
下表总结了定义在头文件<signal.h>中的标准信号。

信号说明
SIGABRT程序的异常终止(如对函数abort的调用)
SIGFPE一个错误的算术运算操作。如除数为零或者运算结果溢出
SIGILL检测到一个非法指令
SIGINT收到一个交互提示信号(Ctrl+c或command+c)
SIGSEGV试图访问未分配给程序的存储空间
SIGTERM发给程序的终止请求
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<time.h>

void signalHandler(int signalValue){
	printf("\nInterrupt signal (%d) received.\nDo you wish to continue (1 = yes or 0 = no)?",signalValue);
	int response;
	scanf("%d",&response);
	
	while(response != 0 && response != 1){
		printf("(1 = yes or 0 = no)?");
		scanf("%d",&response);
	}
	
	if(response == 1){
		signal(SIGINT, signalHandler);
	}
	else{
		exit(EXIT_SUCCESS);
	}
}

int main(){
	signal(SIGINT, signalHandler);
	srand(time(NULL));
	
	for(int i = 1; i <= 100; ++i){
		int x = 1 + rand() %50;
		
		if(x == 25){
			raise(SIGINT);
		}
		printf("%4d",i);
		
		if(i % 10 == 0){
			printf("\n");
		}
	}
}

上面这个程序,使用了函数signal来捕获一个信号SIGINT。
signal(SIGINT, signalHandler);
这个语句用SIGINT和指向函数signalHandler的指针来调用函数signal。当出现类型为SIGINT的信号时,控制将传递给函数signalHandler。该函数打印出一条信息并提示用户选择是否继续程序的正常执行。如果用户想继续执行程序,则通过再次调用函数signal重新初始化信号处理函数,并将控制返回到原先程序检测到信号的位置。
在程序中,函数raise被用来模拟一个SIGINT信号。程序首先产生一个大小在1~50之间的随机数,若此随机数时25,则调用函数raise来产生一个SIGINT。通常SIGINT是在程序之外产生的。
例如,当程序在Linux/UNIX或Windows系统上运行时,键入组合键Ctrl+c将产生一个能结束程序运行的SIGINT。
本程序中的信号处理功能就是要捕获这样的交互信号以放在程序被恶意终止。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目录 1.1均匀分布的随机数 第一章 数字信号的产生 1.2正态分布的随机数 1.3指数分布的随机数 1.4拉普拉斯(Laplace)分布的随机数 1.5瑞利(Rayleigh)分布的随机数 1.6对数正态分布的随机数 第一篇 常用数字信号的产生 1.7柯西(Cauchy)分布的随机数 1.8韦伯(Weibull)分布的随机数 1.9爱尔朗(Erlang)分布的随机数 1.10贝努里(Bernoulli)分布的随机数 1.11贝努里—高斯分布的随机数 1.12二项式分布的随机数 1.13泊松(Poisson)分布的随机数 1.14ARMA(p,q)模型数据的产生 1.15含有高斯白噪声的正弦组合信号的产生 1.16解析信号的产生 1.1离散傅立叶变换 第一章 快速傅立叶变换 1.2快速傅立叶变换 1.3基4快速傅立叶变换 1.4分裂基快速傅立叶变换 1.5实序列快速傅立叶变换(一) 1.6实序列快速傅立叶变换(二) 1.7用一个N点复序列的FFT同时计算两个N点实序列离散傅立叶变换 1.8共轭对称序列的快速傅立叶反变换 1.9素因子快速傅立叶变换 1.10ChirpZ—变换算法 2.1快速哈特莱(Hartley)变换 第二章 快速离散正交变换 2.2基4快速哈特莱(Hartley)变换 第二篇 数字信号处理 2.3分裂基快速哈特莱(Hartley)变换 2.4快速离散余弦变换 2.5快速离散余弦反变换 2.6N=8点快速离散余弦变换 2.7N=8点快速离散余弦反变换 2.8快速离散正弦变换 2.9快速沃尔什(Walsh)变换 2.10快速希尔伯特变换(一) 2.11快速希尔伯特变换(二) 3.1快速卷积 第三章 快速卷积与相关 3.2长序列的快速卷积 3.3特别长序列的快速卷积 3.4快速相关 4.1数字滤波器的频率响应 第四章 数字滤波器的时域和频域响应 4.2级联型数字滤波器的频率响应 4.3数字滤波器的时域响应 4.4直接型IIR数字滤波(一) 4.5直接型IIR数字滤波(二) 4.6级联型IIR数字滤波 4.7并联型IIR数字滤波 5.1巴特沃兹和切比雪夫数字滤波器的设计 第五章 IIR数字滤波器的设计 5.2任意幅度IIR数字滤波器的优化设计 6.1窗函数方法 第六章 FIR数字滤波器的设计 6.2频域最小误差平方设计 6.3切比雪夫逼近方法 1.1功率谱估计的周期图方法 第一章 经典谱估计 1.2功率谱估计的相关方法 2.1求解一般托布利兹方程组的莱文森算法 第二章 现代谱估计 2.2求解对称正定方程组的乔里斯基算法 2.3求解尤利—沃克方程的莱文森—德宾算法 2.4计算ARMA模型的功率谱密度 2.5尤利—沃克谱估计算法 2.6协方差谱估计算法 2.7Burg谱估计算法 2.8最大似然谱估计算法 3.1维格纳(Wigner)分布 第三章 时—频分析 3.2离散小波变换 4.1维纳(Wiener)数字滤波 第四章 随机信号的数字滤波 4.2卡尔曼(Kalman)数字滤波 4.3最小均方(LMS)自适应数字滤波 4.4归一化LMS自适应数字滤波 4.5递推最小二乘(RLS)自适应数字滤波 1.1图像读取、存储与显示 第四篇 数字图像处理 第一章 图像基本运算 1.2图像旋转 1.3图像灰度级直方图的计算 1.4图像二值化的固定阀值法 1.5图像二值化的自适应阀值法 第三篇 随机数字信号处理 2.1图像直方图均衡 第二章 图像增强 2.2中值滤波 2.3图像锐化 2.4图像平滑 3.1Roberts算子边缘检测 第三章 图像边缘检测 3.2拉普拉斯算子边缘检测 3.3Sobel算子边缘检测 3.4Robinson算子边缘检测 3.5Kirsch算子边缘检测 3.6Prewitt算子边缘检测 4.1Hilditch细化算法 第四章 图像细化 4.2Pavlidis细化算法 4.3Rosenfeld细化算法 1.1多层感知器神经网络 第一章 神经网络模型 1.2离散Hopfield神经网络 1.3连续Hopfield神经网络 第五篇 人工神经网络 1.4Tank-Hopfield线性规划神经网络

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_200_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值