一、信号简介
信号是Linux系统为了相应某些状况而产生的事件。
进程收到信号后采取相应的动作。
kill -l可以查看所有信号
二、信号的产生
-
按键触发:比如ctrl + C 产生了SIGINT(2);ctrl + \ 产生SIGQUIT (3) ; ctrl +z 产生了SIGSTOP(19)
-
非法内存操作:如果内存管理出错,系统就会发送信号进行处理,SIGSEGV(11)
-
硬件故障:硬件出现故障或者接触不良等,系统也会发送一个信号;
-
由软件条件产生信号,系统调用或者其他条件。
三、信号处理
1、signal函数
#include <signal.h>
typedef void (*sighandler_t)(int); //函数指针,对应下面的handle函数
sighandler_t signal(int signum, sighandler_t handler);
函数原型:
sighandler_t signal(int signum, sighandler_t handler);
参数:
@ signum : 信号号
@ handler:处理方式
信号的处理方式有三种:默认、捕捉、忽略
1)捕捉:
使用处理函数:
void signal_handle(int signum){
//对信号进行处理的执行代码
}
2)默认:signal函数的第二个参数handler直接填为SIG_DFL;
3)忽略:signal函数的第二个参数handler直接填为SIG_IGN;
返回值:成功返回函数的第二个参数,失败返回SIG_ERR,并置位错误码。
2、示例
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
void signal_handle(int signum){
if(signum == 2){
printf("catch %d signal\n", signum);
system("ls");
}
}
int main(){
while(1){
//忽略
//signal(SIGINT, SIG_IGN); //传入的参数可以是数字,也可以是信号的名字
//默认
//signal(19, SIG_DFL);
//捕捉
signal(2, signal_handle);
}
return 0;
}
3、特殊信号
SIGKILL(9) SIGSTOP(19)
信号9和信号19,不能被忽略和捕捉
4、kill命令
格式:
kill [options] <pid> [...]
参数:
options : 要发送的信号
pid : 进程号,
每一个程序运行的时候都会产生一个进程号,查看进程号的命令:ps -ef
比如要对某个进程发送2号信号,可以写为kill -2 进程号