Linux进程间通信-signal信号

信号

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

Linux进程间通信-signal信号

上一篇:如何拍摄飞舞的雪花?雪花拍摄技巧


下一篇:PHPSTORM破解版激活方式方法