信号

​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​​ 也无法结束程序

上面操作的执行结果见图:Linux进程间通信-signal信号_回调函数

注意:对信号​​SIGKILL(9)​​ 注册的回调无效.