进程通信之linux信号机制

摘要:本文主要介绍,linux进程通信中的信号机制,介绍信号的本质与作用原理;重点讲解信号的处理流程,同时介绍了信号的安装\发送\阻塞等概念.

1.信号本质

软中断信号用来通知进程发生了异步事件,是对中断机制的一种模拟.这与收到中断请求的过程是类似的.进程之间可以通过kill来发送软中断信号.

信号的发送者:内核通过内部事件发送信号+进程可以通过系统调用发送信号. 信号的功能:通知+附加信息

2.信号的种类

先来回忆一下中断种类:硬件int(外部int)和软件int(内部).类似,信号也可以分为两种: 以可靠性分类:可靠信号和不可靠信号 时间分类:实时信号/非实时信号

2.1信号可靠性

信号值小于SIGRTMIN的信号都是不可靠信号,它们不支持排队,会丢失.

2.2信号的实时性

早期UNIX系统,仅仅定义了32种信号,每个信号都有确定的用途和含义由各自的缺省动作.后32个信号表示实时信号,等同于可靠信号,这保证了发送的多个实时信号都能被接收.

非实时信号都不能排队,都是不可靠信号;实时信号都能排队,都是可靠信号.

3.信号处理流程

对比中断处理方法,总体上信号处理方法由三种: – 信号处理程序 – 忽略 – 系统默认处理:大部分信号的缺省操作是终止进程,也可以通过系统调用signal指定进程对某个信号的处理行为.

和中断类似,信号处理流程为三个步骤: 1. 信号产生 2. 信号zhuce 3. 信号执行和注销

3.1 信号产生

信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。

3.2 signal注册

PCB(进程控制块,也叫进程表项)中,有一个软中断信号域.内核给一个进程发送软件中断的方法,是将对应位set.如果信号发送给一个正在睡眠的进程,如果进程睡眠在可被中断的优先级上,则唤醒进程;否则仅设置进程表中信号域相应的位,而不唤醒进程。如果发送给一个处于可运行状态的进程,则只置相应的域即可。

进程中未决信号数据结构:struct sigpending pending

struct sigpending{        struct sigqueue *head, *tail;//未决信号信息链        sigset_t signal;//未决信号集合};struct sigqueue{        struct sigqueue *next;        siginfo_t info;}

信号在进程中注册指的就是信号值加入到进程的未决信号集sigset_t signal(每个信号占用一位)中,并且信号所携带的信息被保留到未决信号信息链的某个sigqueue结构中。只要信号在进程的未决信号集中,表明进程已经知道这些信号的存在,但还没来得及处理,或者该信号被进程阻塞。

当一个实时信号发送给一个进程时,不管该信号是否已经在进程中注册,都会被再注册一次,因此,信号不会丢失,因此,实时信号又叫做”可靠信号”。这意味着同一个实时信号可以在同一个进程的未决信号信息链中占有多个sigqueue结构(进程每收到一个实时信号,都会为它分配一个结构来登记该信号信息,并把该结构添加在未决信号链尾,即所有诞生的实时信号都会在目标进程中注册)。

当一个非实时信号发送给一个进程时,如果该信号已经在进程中注册(通过sigset_t signal指示),则该信号将被丢弃,造成信号丢失。因此,非实时信号又叫做”不可靠信号”。这意味着同一个非实时信号在进程的未决信号信息链中,至多占有一个sigqueue结构。

总之信号注册与否,与发送信号的函数(如kill()或sigqueue()等)以及信号安装函数(signal()及sigaction())无关,只与信号值有关(信号值小于SIGRTMIN的信号最多只注册一次,信号值在SIGRTMIN及SIGRTMAX之间的信号,只要被进程接收到就被注册)

3.3 信号的执行和注销

中断的执行时机是在指令周期的结束和进程上下文中,因此进程必须处在运行态.当其由于被信号唤醒或者正常调度重新获得CPU时,在其从内核空间返回到用户空间时会检测是否有信号等待处理。如果存在未决信号等待处理且该信号没有被进程阻塞,则在运行相应的信号处理函数前,进程会把信号在未决信号链中占有的结构卸掉。

内核处理一个进程收到的信号的时机是在一个进程从内核态返回用户态时。所以,当一个进程在内核态下运行时,软中断信号并不立即起作用,要等到将返回用户态时才处理。进程只有处理完信号才会返回用户态,进程在用户态下不会有未处理完的信号。

如果需要使用信号进行进程间通信,那么我们还需要了解下面四个部分的内容,本文不再详细讲解:

    信号的安装信号的发送信号集和信号集操作函数信号阻塞和信号未决

学习会使你永远立于不败之地。

进程通信之linux信号机制

相关文章:

你感兴趣的文章:

标签云: