Linux信号基础

转载 2015年07月09日 07:58:45

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!`

Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可以将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客。每个进程拥有一个独立的房间(属于进程的内存空间),而每个房间都是不允许该进程之外的人进入。这样,每个进程都只专注于自己干的事情,而不考虑其他进程,同时也不让别的进程看到自己的房间内部。这对于每个进程来说是一种保护机制。(想像一下几百个进程总是要干涉对方,那会有多么混乱,或者几百个进程相互偷窥……)

然而,在一些情况,我们需要打破封闭的房间,以便和进程交流信息。比如说,内核发现有一个进程在砸墙(硬件错误),需要让进程意识到这样继续下去会毁了整个大楼。再比如说,我们想让多个进程之间合作。这样,我们就需要一定的通信方式。信号(signal)就是一种向进程传递信息的方式。我们可以将信号想象成大楼的管理员往房间的信箱里塞小纸条。随后进程取出小纸条,会根据纸条上的内容来采取一定的行动,比如灯坏了,提醒进程使用手电。(当然,也可以完全无视这张纸条,然而在失火这样紧急的状况下,无视信号不是个好的选择)。相对于其他的进程间通信方式(interprocess communication, 比如说pipe, shared memory)来说,信号所能传递的信息比较粗糙,只是一个整数。但正是由于传递的信息量少,信号也便于管理和使用。信号因此被经常地用于系统管理相关的任务,比如通知进程终结、中止或者恢复等等。

这里写图片描述

信号是由内核(kernel)管理的。信号的产生方式多种多样,它可以是内核自身产生的,比如出现硬件错误(比如出现分母为0的除法运算,或者出现segmentation fault),内核需要通知某一进程;也可以是其它进程产生的,发送给内核,再由内核传递给目标进程。内核中针对每一个进程都有一个表存储相关信息(房间的信箱)。当内核需要将信号传递给某个进程时,就在该进程相对应的表中的适当位置写入信号(塞入纸条),这样,就生成(generate)了信号。当该进程执行系统调用时,在系统调用完成后退出内核时,都会顺便查看信箱里的信息。如果有信号,进程会执行对应该信号的操作(signal action, 也叫做信号处理signal disposition),此时叫做执行(deliver)信号。从信号的生成到信号的传递的时间,信号处于等待(pending)状态(纸条还没有被查看)。我们同样可以设计程序,让其生成的进程阻塞(block)某些信号,也就是让这些信号始终处于等待的状态,直到进程取消阻塞(unblock)或者无视信号。

常见信号


信号所传递的每一个整数都被赋予了特殊的意义,并有一个信号名对应该整数。常见的信号有SIGINT, SIGQUIT, SIGCONT, SIGTSTP, SIGALRM等。这些都是信号的名字。你可以通过

$man 7 signal

来查阅更多的信号。

上面几个信号中,

SIGINT 当键盘按下CTRL+C从shell中发出信号,信号被传递给shell中前台运行的进程,对应该信号的默认操作是中断 (INTERRUPT) 该进程。

SIGQUIT 当键盘按下CTRL+\从shell中发出信号,信号被传递给shell中前台运行的进程,对应该信号的默认操作是退出 (QUIT) 该进程。

SIGTSTP 当键盘按下CTRL+Z从shell中发出信号,信号被传递给shell中前台运行的进程,对应该信号的默认操作是暂停 (STOP) 该进程。

SIGCONT 用于通知暂停的进程继续。

SIGALRM 起到定时器的作用,通常是程序在一定的时间之后才生成该信号。

在shell中使用信号


下面我们实际应用一下信号。我们在shell中运行ping:

$ping localhost

此时我们可以通过CTRL+Z来将SIGTSTP传递给该进程。shell中显示:

[1]+ Stopped ping localhost
我们使用$ps来查询ping进程的PID (PID是ping进程的房间号), 在我的机器中为27397

我们可以在shell中通过$kill命令来向某个进程发出信号:

$kill -SIGCONT 27397

来传递SIGCONT信号给ping进程。

信号处理 (signal disposition)


在上面的例子中,所有的信号都采取了对应信号的默认操作。但这并不绝对。当进程决定执行信号的时候,有下面几种可能:

1) 无视(ignore)信号,信号被清除,进程本身不采取任何特殊的操作

2) 默认(default)操作。每个信号对应有一定的默认操作。比如上面SIGCONT用于继续进程。

3) 自定义操作。也叫做获取 (catch) 信号。执行进程中预设的对应于该信号的操作。

进程会采取哪种操作,要根据该进程的程序设计。特别是获取信号的情况,程序往往会设置一些比较长而复杂的操作(通常将这些操作放到一个函数中)。

信号常常被用于系统管理,所以它的内容相当庞杂。深入了解信号,需要一定的Linux环境编程知识。

总结


信号机制; generate, deliver, pending, blocking

signal action/dispositon; ignore, default action, catch signal

$kill

Linux进程间通信(五)---信号通信之signal()、信号集函数组及其基础实验

上一节介绍进程间通信方式之一信号通信中的信号产生和捕捉函数,这一节介绍信号处理函数signal()函数和信号集函数组,接上一节http://blog.csdn.net/mybelief321/arti...
  • mybelief321
  • mybelief321
  • 2013年06月13日 10:16
  • 4217

零基础玩转微信公众平台开发

寒假期间闲来无事,想学习下微信公众平台的开发,在这里和大家分享下学习经验和体会。希望大家能够从我这系列文章中,收获到一些东西。闲话不多说了,接下来让我们一起开始我们的微信开发之旅吧!         ...
  • u012926924
  • u012926924
  • 2015年02月08日 15:05
  • 1132

语音信号之基础知识(一)

%%感染了一个学年的语音氛围,自己也做了一些这方面的y
  • yongchunaq
  • yongchunaq
  • 2014年06月29日 18:16
  • 1897

Linux信号基础知识

  • 2012年12月19日 15:23
  • 338KB
  • 下载

linux基础编程:进程通信之System V IPC:消息队列,信号量,共享内存

Linux下的进程通信基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧...
  • ColZer
  • ColZer
  • 2012年11月05日 17:19
  • 4245

Linux编程基础——信号

转载自http://www.cnblogs.com/TianFang/archive/2013/01/25/2875943.html Linux编程基础——信号 基本概念 信号在Linux中是一...
  • I_feige
  • I_feige
  • 2016年11月29日 16:45
  • 129

Linux基础篇——信号

Linux下的信号列表 列表中,编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号...
  • zw_1510
  • zw_1510
  • 2016年07月09日 12:31
  • 178

【Linux】信号的基础知识&mysleep的实现

1、基本信号 1.1产生信号的条件:   1)键盘 sigint--ctrl+c    sigouit--ctrl+\     sigstp--ctrl+z 2)硬件异常(SIGS...
  • zweina111
  • zweina111
  • 2016年08月31日 19:05
  • 201

Linux信号基础

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可...
  • yidangui
  • yidangui
  • 2013年02月17日 19:49
  • 167

【Linux基础】信号量应用实例

信号量相关函数 System V信号量所用到的基本系统调用有三个:函数semget()是创建一个新信号量或取得一个已有信号量的键。函数semop函数用于改变信号量的值。函数semctl允许直接控制信...
  • u010926630
  • u010926630
  • 2013年06月24日 14:04
  • 418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux信号基础
举报原因:
原因补充:

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