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