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

原创 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。





深入理解计算机系统的代码

  • 2013年03月26日 23:15
  • 75KB
  • 下载

《深入理解计算机系统》之家庭作业8.25题答案

#include "csapp.h" static sigjmp_buf env; //当调用sigsetjmp函数时将当前调用环境保存在缓冲区env中,以供后面siglongjum使用 ...
  • u013457146
  • u013457146
  • 2014年10月21日 15:42
  • 955

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

11.6 A. 因为read_requesthdrs中已经打印出了请求报头,所以只要打印请求行即可。在doit函数中第一个sscanf语句之后添加下面的语句即可:printf("%s %s ...
  • zhanyu1990
  • zhanyu1990
  • 2014年01月24日 18:18
  • 1676

深入理解计算机系统家庭作业第四章(4.43-4.54)

/* *****4.43  */ A.
  • phx_storm
  • phx_storm
  • 2014年09月23日 22:40
  • 2623

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

7.6 符号 swap.o 条目 符号类型 定义符号的模块 所属的节 buf Yes extern ...
  • zhanyu1990
  • zhanyu1990
  • 2013年08月24日 13:24
  • 2782

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

8.9 进程对 是否并发 AB No AC Yes AD Yes ...
  • zhanyu1990
  • zhanyu1990
  • 2013年09月02日 09:51
  • 3801

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

/* $begin shellmain */ #include "csapp.h" #define MAXARGS   128 /* function prototypes */ void eval...
  • sanwu2010
  • sanwu2010
  • 2013年12月03日 09:42
  • 674

《深入理解计算机系统》第八章 (三)回收子进程

进程总是处在下面三种状态的一种: (1)运行(2)停止(3)终止。  进程终止的原因: (1)收到一个默认行为是终止进程的信号    (2)从主程序中返回    (3)调用exit函数 一个终...
  • sanwu2010
  • sanwu2010
  • 2013年12月03日 11:33
  • 509

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

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

《深入理解计算机系统》课程主讲人本书作者pdf版本第20节讲义 ECF:信号和非本地跳转

  • 2017年04月09日 15:11
  • 347KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《深入理解计算机系统》第八章 (四)信号
举报原因:
原因补充:

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