linux 信号机制介绍

1、信号概述(1) 信号是什么?信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。软件层次对于中断机制的模拟说中断,一般针对的是cpu。就是说cpu正在处理一个进程,通过发送中断请求,可以让cpu先暂时停止手中的活儿,来处理更紧急的事情。而说信号是对中断的模拟是指,正在运行的程序,被发来的信号打断,取执行别的更紧急的事情。因此,信号操作的(针对的)对象是进程。异步通信方式异...
摘要由CSDN通过智能技术生成

1、信号概述

(1) 信号是什么?

信号是在软件层次上对中断机制的一种模拟是一种异步通信方式

  • 软件层次对于中断机制的模拟
    说中断,一般针对的是cpu。就是说cpu正在处理一个进程,通过发送中断请求,可以让cpu先暂时停止手中的活儿,来处理更紧急的事情。而说信号是对中断的模拟是指,正在运行的程序,被发来的信号打断,取执行别的更紧急的事情。因此,信号操作的(针对的)对象是进程。
  • 异步通信方式
    异步指的是一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
(2)信号用来干什么?

上面说了,信号是一种通信方式,那它的作用一定是用来通信的。信号可以用来进行进程之间的通信,因为我们知道每个进程的内存空间是独立的,那么进程之间想要通信(相互发送信息),那么就需要一种机制来实现。在linux中有好几种这样的机制,其中信号机制就是其中的一种。信号的具体作用是:

  • 实现用户空间和用户空间进程之间的通信。(比如:进程A向进程B发送一个信号,这个信号的目的是将进程B给终止了。)
  • 实现内核空间和用户空间之间的通信。(比如:通知用户进程发生了某个系统事件。)

2、信号的分类

信号可以分为可靠信号(实时信号)和不可靠信号(非实时)。

(1)那么什么是可靠信号,什么是不可靠信号呢?

见名便可知其义。比如进程A和进程B进行通信。

  • 那么可靠信号指的就是,A发送了一个信号,B一定能够接收到,并且记着我有这么一个信号等着我处理,A再给B发同一个信号,B能知道A给B发了两次(这两次信号被记录在一个队列里)。并且能处理两次。这种通信就是可靠的。
  • 而不可靠信号就是,进程A发送了一个信号给进程B,说我需要X资源一个,还没等B处理这个事儿,过了一会进程A又发送了一个信号给进程B,又发送了我需要X资源一个。那么进程B会忘记A第一次发送的资源X,它只会给A一个资源X(不可靠信号没有队列来记录信号发送了几次。大于一次只会按一次处理)。这个时候就产生了信号的丢失。这种通信就是不可靠的。
(2)既然可靠信号这么好,为啥还要不可靠信号呢?

这其实是一个历史遗留问题,Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,信号机制是不可靠信号机制。随着时间发展,又发明了新的可靠的信号机制。为了和原来的机制兼容,老的和新的都存在与系统中。

(3)怎么分辨老的信号(不可靠信号)和新的信号呢(可靠信号)呢?

在linux上的体现是:信号值位于SIGRTMIN和SIGRTMAX之间的信号都是可靠信号。也就是linux定义的信号的个数是有限的,而且每个信号只是一个数值,这些数值都定义了一个名字,如下:

在这里插入图片描述

3、处理信号的方式

当某个进程接收到一个信号时,有三种处理方式可选:

  • 方式一:是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。
  • 方式二:忽略某个信号,对该信号不做任何处理,就象未发生过一样。
  • 方式三:对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。

怎样选择如何处理一个信号的方式?
这属于信号的部署,也就是我们在写一个程序时,就要按照我们的需求,提前定义好当程序接受到某个信号时,我们以什么样的方式处理。

3、信号在操作系统中的表示

我们知道,内核以一个task_struct 结构变量来标识一个进程。而我们的信号在操作系统中的体现,也记录在这个结构体中。
在这里插入图片描述

(1)解读上述图片

如上图,task_struct 表示一个进程表。我们可以认为,这这个进程表中,有一个字段为一个表格。我们可以认为这个表格有三列,分贝记录了我们是否有等待处理的信号(pending 列),以及这个信号是否被阻塞着(block 列),以及处理这个信号的方式是什么(handler)(这是一个函数指针),每个信号都有这三个标志位。

信号产生时,内核在进程控制块中设置该信号的未决标志(表示某信号是否发生过),直到信号处理完毕才清除该标志。在上图的例子中:

(2)表格的第三列:信号的三种处理方式

  • SIGHUP信号未阻塞也未产生过,当它递达时执行默认处理动作。
  • SIGINT信号产生过,但正在被阻塞,所以暂时不能投递(暂时不能处理)。虽然它的处理动作是忽略,但在没有解除阻塞之前不能忽略这个信号,因为进程仍有机会改变处理动作之后再解除阻塞。 信号未决。
  • SIGQUIT信号未产生过,一旦产生SIGQUIT信号将被阻塞,它的处理动作是用户自定义函数sighandler。

未决和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集。这个类型可以表示每个信号的“有效”或“无效”状态。在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞。而在未决信号集中“有效”和“无效”的含义是该信号是否处于未决状态。(有关信号集的概念后面还有补充。)

(3)在上面的图片中,记录了三个信号的状态信息:

  • 第一行,记录着SIGHUP信号的信息,即:
    现在还没有收到这个信号,如果收到的话,信号不会被阻塞,而是马上处理,处理这个信号的方式是采用SIG_DFL,即默认的方式处理。默认的方式就是系统预定义的方式。

  • 第二行,记录着SIGINT信号的信息,即:
    现在已经收到这个信号,但是信号被阻塞着,像这种状态下的信号,我们给它起了一个名字叫信号未决。如果信号解除阻塞的话,处理这个信号的方式是:SIG_IGN。即忽略这个信号。

  • 第三行,记录着SIGQUIT信号的信息,即:
    现在还没有收到这个信号,如果收到信号被阻塞着。如果收到这样的信号,信号将被阻塞。如果信号解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值