【进程间通信】信号

信号(signal)机制是在软件层次上对中断机制的一种模拟;从概念上说,一个进程收到一个信号与一个处理器接收到一个中断请求是一样的;而另一个进程可以向另一个(或另一组)进程发送信号;也跟在多处理器中一个处理器可以向其他处理器发送中断请求一样,中断源可以是本处理器本身,也可能是各种外设设备;信号,也不一定来自其他进程,可以来自不同的来源,还可以来自本进程的执行;处理器在执行一段程序并不需要停下来等待中断的发生,也不知道何时发生;信号也是一样,一个进程并不需要通过一个什么操作来等待信号的到达,也不知道什么时候就有信号到达;


(1)事实上,在所有的进程间通信机制中只有信号是异步的;中断和信号二者之间的这种相似和类比不仅仅是概念上的,也体现在它们的实现上;就像中断机制中有一个中断向量表一样,在每一个进程的task_struct结构中都有一个指针sig,指向一个signal_struct结构,即为信号向量表;在中断机制中,对每个中断请求都可以加以屏蔽而不让处理器对之响应,在信号机制中也有类似的手段;但是信号总归是软件上来实现的,中断是软硬件结合实现的;

(2)早期的信号机制比较简单和原始,是不可靠的;Linux内核的信号机制符合POSIX.4的规定;每一个进程的task_struct中有一个指针sig,指向一个signal_struct(action[]是一个信号向量表,数组中每一个元素就相当于一个信号向量,确定了当进程接收到一个具体的信号时应该采取的行动,不过它还有SIG_DFL和SIG_IGN分别是默认处理和忽略处理,但是信号向量表中处理程序一般是在用户空间的);对信号的检测和响应总是发生在系统空间,当前进程处于系统调用,中断或异常而进入系统空间以后,从系统空间返回用户空间前夕;也可以是当前进程在内核中进入睡眠以后刚被唤醒的时候,由于信号的存在而提前返回到用户空间;当有信号要响应时,处理器的执行路线如下:


(3)早期的信号向量表中,每一个向量都是函数指针,如今是一个k_sigaction,其中_sa_handler和_sa_sigaction仍是函数指针,sa_mask是一个位图,其中每一位对应着一种信号;如果位图中的某一位为0,变瘦执行当前信号的处理程序的相应信号暂时被屏蔽了;不管位图中相应位是否为1,当前信号总是自动屏蔽的,使得对同一中信号的处理不会嵌套发生,除非sa_mask中的SA_NODEFER或SA_NOMASK标志位1;显然,这正是借鉴中断服务程序关闭中断防止嵌套的经验,这是将不可靠信号改成可靠信号的关键一步;当我么按下ctrl+C时,会使当前运行的程序流产,内核会向相应的进程发一个SIGINT,而这个信号默认处理就是do_exit(),可为该信号绑定处理程序,早期的实现机制,会让该设置流产,这里的屏蔽并不是将信号丢弃,已经到达的信号仍旧存在;sa_mask值sigset类型,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值