信号(signal)处理

1.信号介绍

	1.1 信号是信息的载体,是一种通信方式,信号在我们的生活中随处可见。
	例如:
		古代战争中摔杯为号
		体育比赛中使用的信号枪
	1.2 信号的特点
		1.2.1 简单
		1.2.2 不能携带大量信息
		1.2.3 满足某个特点条件才会产生

2.信号的机制

	2.1 进程A给进程B发送信号,进程B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕后再继续执行。与硬件中断类似——异步模式。但信号是软件层面上实现的中断,早期常被称为“软中断”。
	2.2 每个进程收到的所有信号,都是由内核负责发送的。
	2.3 进程A给进程B发送信号示意图:

在这里插入图片描述

3.常见信号

	3.1 SIGINT
		程序终止(interrupt)信号,在用户键入INTR字符(通常是Ctrl+C)时发出,用于通知前台进程组终止进程。
	3.2 SIGQUIT
		和SIGINT类似,但由QUIT字符(通常是Ctrl+\)来控制,进程在因收到SIGQUIT退出时会产生core文件,在这个意义上类似于一个程序错误信号。
	3.3 SIGKILL
		SIGKILL信号不能被阻塞,处理或忽略,所有的进程在不能被结束时,才用kill发送SIGKILL信号即可。即:kill -9 进程号。
	3.4 SIGTERM
		程序结束(terminate)信号,与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
	3.5 SIGSTOP
		停止(stopped)进程的执行,注意它和terminate以及interrupt的区别:该进程还未结束,只是暂停执行,本信号不能被阻塞,处理或忽略。

4.信号应用场景

	4.1 开发的所有程序都是一直在运行的,当需要更换或者重启程序就需要kill掉进程,但是程序初始化的很多东西需要关闭,避免造成内存泄漏,这时候就需要捕捉对应的信号并做处理。
	常见处理有:
		关闭日志
		关闭数据库
		释放共享内存
		关闭相关文件描述符
		程序正常退出(exit(0))

5.信号处理函数

	5.1 signal函数
	函数作用:注册信号捕捉函数
	函数原型:
	 		typedef void (*sighandler_t)(int);
	       	sighandler_t signal(int signum, sighandler_t handler);
	函数参数:
			signum:信号编号
			handler:信号处理函数

6.信号应用

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>

//信号处理函数
void sighandler(int signo)
{
	printf("signo==[%d]\n", signo);
	//exit(0);根据实际需求决定程序是否退出
}

int main()
{
	//注册信号处理函数,可同时监听多个信号
	signal(SIGINT, sighandler);//Ctrl+C
	signal(SIGTERM,sighandler);//killall

	while(1)
	{
		sleep(10);
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值