信号的一生及其与线程的关系

信号简述信号是一种软件中断,用来处理异步事件。内核递送这些异步事件到某个进程,告诉进程某个特殊事件发生了。这些异步事件,可能来自硬件,比如访问了非法的内存地址,或者除以0了,可能来自用户的输入,比如shell终端上用户在键盘上敲击了Ctrl+C;还可能来自另一个进程,甚至来自进程自身。信号的本质是一种进程间的通信,一个进程向另一个进程发送信号,内核至少传递了信号值这个字段。实际上,通信的内容不...
摘要由CSDN通过智能技术生成

信号简述

信号是一种软件中断,用来处理异步事件。内核递送这些异步事件到某个进程,告诉进程某个特殊事件发生了。这些异步事件,可能来自硬件,比如访问了非法的内存地址,或者除以0了,可能来自用户的输入,比如shell终端上用户在键盘上敲击了Ctrl+C;还可能来自另一个进程,甚至来自进程自身。

信号的本质是一种进程间的通信,一个进程向另一个进程发送信号,内核至少传递了信号值这个字段。实际上,通信的内容不止是信号值。

那么如何将信号发送给进程呢?
对于发送的信号,内核会根据信号发送的目标进程尝试递送给该进程。内核会依据不同的情况采取不同的措施,如进程正在阻塞或者忙等不可中断等,这时内核就会把该信号挂起记录到进程task_struct的挂起信号量上;如进程屏蔽该信号或者该信号已经挂起那么内核就会忽略该信号;正常情况下,如果进程可接受信号那么进程就会在当前的执行流中断转而执行该信号处理函数(之前注册过的),执行完成后一般返回中断处继续执行。

信号的完整生命周期

信号的本质是一种进程间的通信。进程之间约定好:如果发生了某件事件就向目标进程发送某特定信号X,而目标进程看到就意识到某事件发生了,目标进程就会执行相应的动作。

接下来以配置文件改变为例,来描述整个过程。很多应用都有配置文件,如果配置文件发生改变,需要通知进程重新加载配置文件。一般而言,程序会默认采用SIGHUP信号来通知目标进程重新加载配置文件。
目标进程首先约定,只要收到SIGHUP,就执行重新加载配置文件的动作。这个行为称为信号的安装,或者信号处理函数的注册。安装好了之后,因为信号是异步事件,不知道何时会发生,所以目标进程依然正常地干自己的事情。收到SIGHUP信号,然后Linux内核就在目标进程的进程描述符里记录了一笔:收到SIGHUP一枚。Linux内核会在适当的时机,将信号递送给进程。在内核收到信号,但是还没有递送给目标进程的这一段时间。在内核收到信号,但是还没有递送给目标进程的这一段时间里,信号处于挂起状态,被称为挂起信号,也称为挂起信号,也称为未决信号。内核将信号递送给进程,进程就会暂停当前的控制流ÿ

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值