APUE第十章 信号

来源:互联网 发布:mysql分32位和64位吗 编辑:程序博客网 时间:2024/05/29 13:48

引入

同步:一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到搜到返回信息才继续执行。
异步:一个进程在执行某个请求的时候,不需要一直等下去,而是继续执行之后的操作,有消息返回时系统会通知进程进行处理。

同步和异步关注的是进程之间的消息通信机制,区别阻塞和非阻塞关注进程等待调用结果时的状态。

信号(signal)是软件中断。信号的作用:

  • 由发出进程告诉接收进程一个特定的事件已经发生
  • 强迫进程执行它自己代码中的信号处理程序

信号概念

首先搞清楚硬中断、软终端和信号的区别。
硬中断是外部设备对CPU的中断,分为“上半部”和“下半部”两个阶段:上半部在屏蔽中断的上下文中运行,用于完成关键性的处理动作;而下半部则相对来说并不是非常紧急的,而且不在中断服务上下文中执行。
软中断是硬中断服务程序对内核的中断,利用硬件中断的概念,用软件方式进行模拟,是硬件中断的下半部(bottom half)。
软中断一般是指由指令int引起的“伪”中断动作——给CPU制造一个中断的假象;而硬中断则是实实在在由8259的连线触发的中断。
信号是由内核(或其他进程)对某个进程的中断,信号用来通知进程发生了异步事件,进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。

注:不能简单地讲软中断和信号混为一谈。软中断是指通过系统调用陷入内核态,而信号处理通常中断进程,虽然我们发现信号,找到信号处理函数的时刻处于内核态中,但是我们需要从内核态跑到用户态去执行信号处理程序,执行完毕后还要返回内核态
这里写图片描述
进程对信号的处理:

  1. 忽略此信号。

  2. 执行该信号的默认处理动作。

  3. 捕捉信号提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函 数,这种方式称为捕捉(Catch)一个信号。

信号与中断的相似点:

(1)采用了相同的异步通信方式;

(2)当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;

(3)都在处理完毕后返回到原来的断点;

(4)对信号或中断都可进行屏蔽。

信号与中断的区别:

(1)中断有优先级,而信号没有优先级,所有的信号都是平等的;

(2)信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;

(3)中断响应是及时的,而信号响应通常都有较大的时间延迟。

函数signal

UNIX系统信号机制最简单的接口是signal函数。

#include <signal.h>void (*signal(int signo, void (*func))(int);

signo参数是信号名,func值是常量SIG_IGN(忽略此信号)、常量SIG_DFL(执行默认操作)或当接到次信号后要调用的函数的地址(捕捉信号)