Linux系统之信号及处理流程(图详解)

关于Linux系统(信号篇)

  • 引言:信号机制是一种使用信号来进行进程之间传递消息的方法,信号的全称为软中断信号,简称软中断。信号的本质是软件层次上对中断的一种模拟(软中断)。它是一种异步通信的处理机制,事实上,进程并不知道信号何时到来。Linux系统一共有64个信号,其中1-31信号供应用开发者使用
    34-64信号供驱动开发者使用,如图。
    Linux系统之信号及处理流程(图详解)_第1张图片
  1. 信号是什么?
    信号是由用户、系统或进程发送给目标进程的信息,以通知目标进程摸个状态的改变或系统异常。

*信号处理的优先级是大于系统调用的。

  • 看几种常用的信号
    Linux系统之信号及处理流程(图详解)_第2张图片
    大部分常见信号的默认处理方式其实都是终止进程,之所以分成这么多种信号,是为了让进程知道具体是哪个信号,从而判断对应发生的事件。
  • 什么是core文件?
    core文件是在进程收到终止信号并终止程序时,保存当前进程代码和数据的二进制文件,但在实际应用开发中也很少会去查看该文,所以系统默认是不创建该文件,在结束进程时会出现core dumped。
  1. 信号都会有系统默认处理方式,既然有默认那么就说明它的处理方式能修改
  • 信号的三种处理方式:默认、忽略、捕获

  • [ 默认] :进程收到该信号,按照系统默认方式处理。

  • [ 忽略]: 进程直接忽略此信号,对进程没有影响。

  • [ 捕获]: 进程收到信号,则处理用户自定义的捕获函数,而之前的默认处理方式失效。
    修改信号处理方式的函数 :Linux系统之信号及处理流程(图详解)_第3张图片在这里插入图片描述
    SIG_IGN为忽略,SIG_DFL为默认。

捕获效果:
Linux系统之信号及处理流程(图详解)_第4张图片
Linux系统之信号及处理流程(图详解)_第5张图片

其中SIGINT信号是通过ctrl+c发送给运行在当前窗口的前台进程的,用signal设置此信号的处理方式为捕获,捕获函数为fun。
当信号发送时,即使主进程还在执行任务,也会被系统中断来执行捕获函数,捕获函数结束后,进程会回到上次执行的地方。

3.信号处理流程
Linux系统之信号及处理流程(图详解)_第6张图片
4.相关api

//设置变量的值
#include
int sigemptyset(sigset_t *set); //将set变量的64位全部设置为0
int sigfillset(sigset_t *set); //将set变量64为全部设置为1
int sigaddset(sigset_t *set ,int signum); //将信号编号那位设置为1,其他不变
int sigdelset(sigset_t *set ,int signum); //将信号编号那位设置为0,其他不变
//返回值:成功返回0,失败返回-1
//使用变量修改信号屏蔽字
#include

int sigprocmask(int how , const sigset_t *set ,sigset_t *oldset);
/*how:修改方式,SIG_BLOCK--屏蔽某个信号
				SIG_UNBLOCK:打开某个信号
				SIG_SETMASK:直接用set参数替换掉整个屏蔽字
 set:传入设置好的信号集
 oldset:传出修改之前的屏蔽字的值,如果为NULL,表示不保存
*/

代码实现:
Linux系统之信号及处理流程(图详解)_第7张图片
Linux系统之信号及处理流程(图详解)_第8张图片

解释:首先让该进程屏蔽SIGINT信号,即信号屏蔽字对应SIGINT位置1,等到接收到此信号时就将其放到未决信号集,2s之后,该进程取消屏蔽SIGINT信号,这时内核去检查未决信号集对应的SIGINT位是否有信号,如果有,那么处理该信号,所以会看到0s以后会打印一个hello,但再睡眠期间有两个SIGINT信号发来,但等到第二个来的时候未决信号集已经置1了,所以第二个被忽略,之后的SIGINT信号就正常接收了。

你可能感兴趣的:(Linux,linux,信号处理)