什么是Linux信号机制,Linux信号机制要讲解起来没那么简单,本文只是给大家讲解下Linux信号机制的基础知识,让你对Linux信号机制有一些了解,一起来学习下吧 。
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) 该进程 。
推荐阅读
- wlan信号桥是什么
- 孩子将来不孝顺的5个信号,第二种必须改!
- Linux初学者学习命令有什么意义?
- 什么是Linux系统架构?
- Linux文件系统入门详解
- 深入理解Linux文本流
- 初次使用Linux系统时常遇到的问题汇总
- 加快Linux文件拷贝速度的两大方法
- 如何快速清空Linux文件内容
- Linux进程的相关知识介绍