信号
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)
注册的回调无效.