signal() 对 signum 对应的信号安排了一个处理函数(感觉描述为注册了一个回调函数更好理解). 当进程收到值为signum 的信号时会执行回调函数.
这个回调函数以下三个中的一个. 是SIG_IGN , SIG_DFL 和 程序员自己定义的函数的指针中的一个.
SIG_IGN: 忽略signum信号
SIG_DFL: 与信号默认关联的action(监听)将执行
自定义函数: 首先回调被替换为SIG_DFL或者阻塞,然后调用回调函数.调用回调函数会导致信号被阻塞,回调函数结束后信号解除
#include <signal.h>
typedef void (*sighandler_t)(int);
//对 signum 对应的信号安排了一个处理函数(注册了一个回调函数).
sighandler_t signal(int signum, sighandler_t handler);
#include <signal.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void print(int signum){
printf("%d catch\n",signum);
//exit(0);
}
int main(){
pid_t pid = getpid();
printf("当前进程id:%d\n",pid);
//对信号2注册了一个监听, 当接受到信号2时会执行print函数. 信号2对应着ctrl+c
signal(2, print);
while(1);
return 0;
}
上面代码如果没有signal(2, print); 时, 按下Ctrl + c 程序就会终止.
但是加上signal(2, print); 后按下Ctrl + c 程序只会输出2 catch . 在另外一个会话连接中使用kill -2 pid 也无法结束程序
上面操作的执行结果见图:
注意:对信号SIGKILL(9) 注册的回调无效.
原文:https://www.cnblogs.com/zhao66/p/15022323.html