信号基础知识【菜鸟学习日记】

信号与中断

Linux信号是一种进程间异步的通信机制,可以理解为是一种“软中断”。
信号可以使一个正在运行的进程被异步打断,然后转而去处理一个突发的事件。
异步事件是不可预见的,只能通过某些特定的方式来预防,或者说,当该异步事件发生时根据原来设定好的的相应操作去完成。


几种常见信号处理
  • SIGCHLD:子进程退出时会给父进程发送该信号。父进程可以根据该信号来完成对子进程PCB资源的回收
  • SIGSTOPSIGKILL:这两个信号不能被屏蔽、安装,也就是说,用户不能自定义这两个信号的处理
  • SIGSTOPSIGCONT:这两个信号是配对的。一个进程在收到SIGSTOP后会暂停执行,进入暂停状态,并屏蔽SIGKILL所有的信号。当该进程收到SIGCONT信号后会继续执行
  • 信号可以唤醒被中断的进程,例如,可以唤醒调用sleep()函数进入阻塞状态的进程

信号的安装到注销

1、在目标进程中安装该信号,即设置如果进程捕获到该信号时执行的操作代码。

  • Linux采用signalsigaction系统调用来完成该操作

2、 信号被某个进程产生,同时设置此信号的目的进程(一般为目标进程的pid),然后由操作系统管理。

  • Linux采用kill()、arise()、alarm()等系统调用来完成。

3、信号在目的进程被注册。
操作系统将信号添加到目的进程的PCB相关的数据结构中。

  • 未决信号:信号已经产生,但因目标进程暂时屏蔽该信号而不能被目标进程捕获的信号
  • 每个进程的PCB(task_struct结构)中有一个未决信号的数据成员
  • 该成员声明如下:
struct sigpending pending;
struct sigpending
{
   struct sigqueue *head,**tail;//指向未决信号队列
   sigset_t signal;//信号集
}
//第一个和第二个成员分别指向一个sigqueue类型的未决信号队列的队首和队尾
//第三个成员是进程中所有未决信号集

信号链中的每个sigqueue结构体描述一个特定信号所携带的信号,并指向下一个sigqueue结构
该结构声明如下:

//sigqueue结构
struct  sigqueue
{
    struct  sigqueue  *next;
    siginfo_t info;
}
简单来说,信号在进程中注册指的就是将相应的信号值加入到进程的未决信号集中(sigpending结构的第二个成员sigset_t signal),并且将该信号所携带的其它信号信息保留到未决信号队列的某个sigqueue结构体中。
只要信号在进程的未决信号集中,表明进程已经知道这些信号的存在,但还没来得及处理,或者该信号被进程屏蔽。(函数sigpending可取当前进程的屏蔽信号和未决信号)

4、信号在进程中注销
进程在执行信号相对应的处理函数之前,首先要发此信号在进程中注销(该信号在只占用一个sigqueue结构)。
目标进程在执行过程中,会检测是不是还有信号等待处理。进程每次从系统空间返回到用户空间时都会做这样的检查。如果存在未决信号等待处理并且该信号没有被进程屏蔽,则在运行该信号相应的的处理函数前,将此信号在未决信号链中占有的结构卸载掉。


5、信号注销后。
进程在信号注销后,目的进程根据当前进程对此信号设置的处理方式,暂时终止当前进程代码的执行,保护上下文(主要包括临时寄存器数据、当前程序位置以及当前CPU的状态)、转而去执行信号的处理函数,即捕获信号,执行完成后再恢复到被中断的位置继续执行。


发送信号
发送信号是指一个进程向另一个进程发送某个信号值,但实际上并不是直接发送的,而是有操纵系统转发的。

信号的来源有很多种可能:

  1. 用户按终端键产生的信号,如:在终端按“Ctrl+c”,产生一个终止信号。这是产生中断的一种方法
  2. 硬件异常。如:对执行一个无效的存储访问的进程产生一个SIGSEGV
  3. 终止进程信号。其它进程调用kill()函数可将信号发送给另一个进程或进程组。常用次命令终止一个失控的进程。
  4. 软件异常产生信号。当检测到某种软件条件已经发生,并将其通知有关进程是也会产生信号。例如,SIGPIPE(在管道的读进程已终止,后一个进程写此管道)

下图是使用kill命令杀死当前终端的
这里写图片描述


根据发送信号的不同,产生一个信号需要调用的函数也不同
  • 传递一个信号给指定的进程:kill()函数
  • 传递一个信号给当前进程:raise()函数
  • 唤醒一个进程和设置定时alarm函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值