《深入理解计算机系统》第八章 (四)信号

原创 2013年12月04日 17:24:26

信号是软件层面上的异常

(一)Linux信号

可以通过man 7 signal 查看Linux提供的标准信号。其中描述的信号的编号在不同的处理器体系结构的差异有所不同。

(二)信号传送的步骤

传送一个信号到目的进程通常由两个不同的步骤组成:

(1)发送信号

发送信号的原因:

a)内核检测到一个系统事件

b)一个进程调用了kill函数,显式地要求内核发送一个信号给目的进程。

内核通过更新目的进程的上下文的某个状态,发送一个信号给目的进程

发送信号的方式:

a)通过/bin/kill程序发送信号

b)通过键盘发送

常用的与键盘相关的信号:

SIGINT :来自键盘的终端信号(CTRL+C)

SIGQUIT:来自键盘的退出信号(CTRL +\)

SIGSTOP:来自键盘(CTRL+Z)或调试程序的停止信号

c)通过kill函数发送

函数原型如下:

#include<sys/type.h>

#include<signal.h>

int kill(pid_t pid , int sig);

如果pid大于0,则给进程pid 发送信号sig,如果pid小于0,则给abs(pid)进程组中的每个进程发送信号sig。如果pid等于0,则不发送信号

d)通过alarm函数发送

alarm - set an alarm clock for delivery of a signal

#include <unistd.h>

unsigned int alarm(unsigned int seconds);

alarm()  arranges  for  a SIGALRM signal to be delivered to the calling process in seconds seconds.

(2)接收信号

当目的进程被内核强迫以某种方式对信号的发送做出反应时,目的进程就接收了信号。

内核为每个进程在pending位向量中维护着待处理信号的集合,在blocked位向量中维护着被阻塞的信号集合,传送一个类型为k的信号,内核就会设置pending中的k位,接受一个类型为k的信号,内核就会清除pending中的k位。

每个信号类型都有一个预定义的默认行为,是如下当中的一种:

a)进程终止

b)进程终止并转储存储器

c)进程停止直到被SIGCONT信号重启

d)进程忽略该信号

进程可以通过signal函数修改和信号相关联的默认行为,SIGSTOP和SIGKILL两个信号的默认行为是不能修改的。

 #include <signal.h>

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);


signum的值为:SIG_IGN,则忽略类型为signum的信号

signum的值为:SIG_DFL,则类型为signum的信号行为恢复为默认行为

signum的值为:其他值,则设置类型为signum的信号的行为是用户定义的函数(信号处理程序)。只要进程接收到一个类型为signum信号,就调用这个程序


信号处理问题分析的三大要点

(1)待处理信号被阻塞

假设一个进程捕获了一个类型为k的信号,且当前正在运行它的信号处理程序,则如果另外一个类型为k的信号传递给这个进程,则这个类型为k的信号将变成待处理的,不会被接收,直到处理程序返回。

(2)待处理信号不会排队

任意类型的信号,最多只能有一个待处理的信号,所以当上面描述的已经有一个类型为k的待处理信号的时候,后续的传递到这个进程的待处理信号都将被直接丢弃。

(3)系统调用可以被中断

在某些系统中当处理程序捕捉到一个信号时,被中断的慢速系统调用在信号处理程序返回时将不再继续,而是立即返回一个错误条件,并设置errno为EINTR。





相关文章推荐

深入理解计算机系统(第二版) 家庭作业 第八章

8.9 进程对 是否并发 AB No AC Yes AD Yes ...

《深入理解计算机系统》第八章 (二)程序的加载与运行

/* $begin shellmain */ #include "csapp.h" #define MAXARGS   128 /* function prototypes */ void eval...

《深入理解计算机系统》读书笔记6--- 信号

1.信号 ①定义:信号是一种软件形式的异常。 一个信号就是一条小消息,他通知进程系统中发生了一个某种类型的事件。 ②本质:每种信号类型都对应于某种系统事件。 ③作用:硬件异常是由内核异常处理程序处理的...

《深入理解计算机系统》笔记(四)虚拟存储器,malloc,垃圾回收【插图】

概述         ●我们电脑上运行的程序都是使用虚拟存储,跟物理内存根本不搭边。         ●既然虚拟内存是在磁盘上的,为什么它又运行这么好,并没有感觉卡顿?这要感谢程序的局部性!     ...
  • hherima
  • hherima
  • 2013年05月24日 17:49
  • 3736

深入理解计算机系统-之-数值存储(四)--整数在内存中的存储方式

前景回顾前面我们了解到依据CPU的端模式的架构不同,数据的存储的字节序也不同 BE big-endian 大端模式,最直观的字节序 地址低位存储值的高位,地址高位存储值的低位 ,数据填写时,不要考...
  • gatieme
  • gatieme
  • 2016年02月21日 16:04
  • 2715

《深入理解计算机系统》(四)

编译器优化对用户来说应该是不可见的,当程序员用优化选项编译代码时,代码的行为应该和不带优化编译得到的代码行为完全一样,除了它应该运行的更快一点,这样的要求使得编译器不能使用某些类型的优化。 存储器别...

深入理解计算机系统-之-内存寻址(四)--linux中分段机制的实现方式

linux中的分段机制前面说了那么多关于分段机制的实现,其实,Linux以非常有限的方式使用分段。因为,Linux基本不使用分段的机制(注:并不是不使用,使用分段方式还是必须的,会简化程序的编写和运行...
  • gatieme
  • gatieme
  • 2016年02月11日 15:22
  • 1983

计算机系统要素:第八章 虚拟机II 程序控制

本章的内容完全基于第七章,其核心是理解堆栈如何处理函数,并对程序运行控制有更充分的认识。在这里我必须对本书作者致敬,因为这一章的编排实在是太完美了,对于如此抽象的程序调度的概念,作者居然能够由浅入深地...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《深入理解计算机系统》第八章 (四)信号
举报原因:
原因补充:

(最多只允许输入30个字)