Linux 信号(signal):信号的捕捉流程

  在处理信号的时候,其实要经过一系列流程的,本文就来简单介绍一下信号处理的捕捉流程。

一、程序的运行状态

  程序运行状态分为内核态和用户态。程序在运行库函数、用户自定义函数等第三方函数时就会在用户态运行;而程序在运行系统调用接口时是在内核态运行

  因为库函数和自定义函数等都不是系统自己提供的接口,不允许直接访问内核。但系统调用接口是系统提供的,用于访问内核的接口。

运行空间

二、信号捕捉流程

 (1)main函数是一个程序的开始,此时程序运行在用户态,当遇到以下几种情况程序就会从用户态切换到内核态运行:

  • 调用系统调用接口
  • 异常
  • 中断

 (2)运行到内核态之后,系统会针对这些情况进行处理,处理之后,在返回用户态之前系统会进行一个操作:do_signal()。(这个接口就是用来查看现在有没有待处理的信号

 (3)如果查询到了现在有信号待处理,那么就根据信号的处理方式进行处理:

  • 默认处理方式 or 忽略处理方式: 在内核态中对信号进行处理(因为默认的处理方式是系统提供的)
  • 用户自定义的处理方式: 需要切换到用户态去处理自定义的函数

 (4)如果在用户态运行完毕自定义处理函数,那么系统还会再调用一个接口:sigreturn()。(从用户态返回内核态)之所以还要返回内核态是因为系统要再看一下还有没有信号要处理。

 (5)然后在从内核态返回到用户态之前,会再次调用:do_signal()。再次查看有没有信号待处理,如此循环往复,直到某一次发现没有信号待处理了,才会彻底返回用户态,继续接下来的程序运行。

 (6)也就是说,信号的处理其实是在程序运行从内核态切换到用户态之前进行处理的,并且是把当前所有没有处理的信号全都处理完,才会彻底返回用户态进行程序的下一步运行。

上述步骤结合图片食用,效果更佳:

信号捕捉流程

猜你喜欢

转载自blog.csdn.net/weixin_57761086/article/details/128781978
今日推荐