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);
}
int main()
{
signal(SIGINT, sighandler);
signal(SIGTERM,sighandler);
while(1)
{
sleep(10);
}
return 0;
}