在咱们的生活中,信号随处可见。好比,田径比赛中的发令枪,就是给运动员发出起跑的信号;交通路口的红绿灯,就是给咱们发出容许经过或禁止经过的信号。这些信号都有共同的特色:数组
简单;异步
携带少许信息;函数
知足特定条件才发送。人工智能
信号是信息的载体,在Unix/Linux环境下,是一种古老、经典的通讯方式,对于现代Unix/Linux来讲,依然是很是重要的IPC(进程间通讯)方式。调试
Unix系统早期版本就已经提供信号机制,但这些系统(如V7)所提供的信号机制并不完善,比较不可靠,信号可能出现丢失的现象。4.3BSD和SVR3均对信号模型进行了更改,增长了可靠信号机制。但不幸的是,两者并不兼容。POSIX.1对可靠信号机制进行了标准化,从而信号机制在Unix/Linux获得了大力的发展。cdn
信号的机制blog
信号的本质是一种软件中断。它与硬件中断相似,提供了一种处理异步事件的方式,可是是在软件层面上所实现的中断。好比:进程
进程A向进程B发送信号,在收到信号以前,进程B正执行本身的代码。但收到进程A的信号以后,无论进程B代码执行到什么地方,都应暂停运行,转而去处理信号服务函数,处理完毕以后再继续执行本身的代码。事件
因为信号是软件层面上的中断,其实现方式使得信号具备必定的延时性,但这个延时时间很是短,对于用户来讲,基本没法察觉,能够认为具备实时性。it
每一个进程所收到的全部信号,都是由内核负责发送,而且由内核处理。
信号状态
1. 递达状态
信号递送而且送达到目标进程。
2. 未决状态
处于信号产生与信号递达之间的状态。主要是因为阻塞/屏蔽而产生此状态。
3. 信号处理方式
a. 执行默认动做
b. 忽略
c. 捕捉(调用信号服务函数)
4. 阻塞信号集(信号屏蔽字)
该集合用于设置信号屏蔽,当将某个信号加入该集合中时,便可屏蔽该信号。后续收到该信号时,该信号的处理将延后,直到该信号的屏蔽被解除为止。
5. 未决信号集
信号从发出到递达的中间过程,叫做未决状态。内核里有个数组专门用来记录信号的未决状态,叫做未决信号集。当信号处理未决状态时,对应位被置1,不然置0。
解除未决状态的方式有两种:
a. 此信号被解除阻塞
b. 此信号被忽略
信号的编号
想要查看当前系统支持的全部信号可用kill -l命令。
乍一看,信号有64个,其实只有62个,由于没有32,33号信号,同时也不存在0号信号。31号如下的信号称为常规信号,或普通讯号,34号以上的信号称为实时信号。
信号四要素
信号编号;
信号名称;
默认处理动做;
对应的事件。
信号的默认动做有如下几种:
term:终止进程
ign: 忽略信号 (默认即时对该种信号忽略操做)
core:终止进程,生成Core文件。(查验进程死亡缘由, 用于gdb调试)
stop:中止(暂停)进程
cont:继续运行进程
这里要特别注意两个信号:
9) SIGKILL 和 19) SIGSTOP信号,它们是不容许被忽略或被捕捉,只能执行默认动做,同时也不能将其设置为阻塞。这是由于,这两个信号是用来终止进程的,若是它们可以被忽略/捕捉/阻塞,那进程将处于不可控状态,内核将没法对进程进行处理。
更多精彩内容,请关注公众号良许Linux,公众内回复1024可免费得到5T技术资料,包括:Linux,C/C++,Python,树莓派,嵌入式,Java,人工智能,等等。公众号内回复进群,邀请您进高手如云技术交流群。