linux下信号相关

2018-09-12  本文已影响0人  小雨启明
1、信号简介

信号其实是一种软中断

2、kill

kill pid 和kill -15 pid 相等
系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该signal后,将会发生以下的事情
1.程序立刻停止
2.当程序释放相应资源后再停止
3.程序可能仍然继续运行



大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以配置的。如果程序正在等待IO,可能就不会立马做出相应。也就是说,SIGTERM多半是会被阻塞的、忽略。(附上一张进程状态转换图)
kill -9 pid 为强制终止 该信号无法被捕获和忽略 还有SIGSTOP信号 特性相同

#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

void sighandler(int sig){
    if(sig == SIGTERM)
    {
        printf(" 收到15号信号\n");
    }else{
        printf("收到其他信号\n");
    }
}

int main(){
    if(signal(SIGTERM,sighandler) == SIG_ERR){
        printf("mistake");
    }
    signal(SIGKILL,sighandler);
    printf("my pid %d\n",getpid());
    while(1){
        printf("...............\n");
        sleep(10);
    }
    //printf("%d",n);
}

3、信号的流程图

1)signal函数

#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);

signal 信号注册函数
signum 需要捕捉的信号
handler 表示捕获到信号后调用的函数。
2)sigset_t 信号容器
64位整数 用0 ,1表示该位信号在不在集合中。
3)阻塞信号集 未决信号集
阻塞信号集:捕获信号后,不想进行处理的信号集合
未决信号集:捕获信号后,没来得及处理的信号集合
4)sigaction 带参的信号注册函数

4、信号的实现原理和步骤

参考:https://blog.csdn.net/qq_28110727/article/details/77484617
更详细的 包括可靠信号 不可靠信号 等https://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html

上一篇下一篇

猜你喜欢

热点阅读