IPC-信号
一、信号的定义
1、用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。
2、信号是UNIX/Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获。
***
3、信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
二、信号的分类(KILL)
2.1、kill -l 命令列出linux下所有的信号类型
kill -l KILL
得到指定信号的宏值。
SIGRTMIN 信号请求号介于SIGRTMIN和SIGRTMAX之间的信号是可靠的也叫实时信号,除此之外的都是不可靠的,也叫非实时信号
SIGRTMAX 信号请求号介于SIGRTMIN和SIGRTMAX之间的信号是可靠的也叫实时信号,除此之外的都是不可靠的,也叫非实时信号
图示每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,例如其中有 定 义#define SIGINT 2。编号34以上的是实时信号,只讨论编号34以下的部分常用信号。
2.2、常用信号
| 信号名| 宏值| 含义| 硬件产生动作| 软件产生 |
| :---: | :--------:| :----: |:----: |
|SIGHUP| 1| 终端断线 | | kill -1 PID|
|SIGINT| 2| 中断 |Ctrl + C | kill -2 PID|
|SIGKILL| 9| 中断 | | kill -2 PID|
|SIGTERM| 15| 中断 | | kill -2 PID|
|SIGALRM| 2| 中断 | | kill -2 PID|
|SIGKSTOP| 19| 中断 |Ctrl + z | kill -2 PID|
|SIGCONT| 18| 中断 |fg/bg | kill -2 PID|
kill (9)六亲不认的杀掉
term(15)正常的退出进程
因为进程可能屏蔽某些信号,所以它们的用处也就不一样。。。
2.2、SIGINT (2)、SIGKILL(9)、 SIGTERM(15) 区别
SIGINT (9)
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
3) SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
SIGKILL(9)
SIGKILL既不能被应用程序捕获,也不能被阻塞或忽略,其动作是立即结束指定进程。通俗地说,应用程序根本无法“感知”SIGKILL信号,它在完全无准备的情况下,就被收到SIGKILL信号的操作系统给干掉了,显然,在这种“暴力”情况下,应用程序完全没有释放当前占用资源的机会。事实上,SIGKILL信号是直接发给init进程的,它收到该信号后,负责终止pid指定的进程。在某些情况下(如进程已经hang死,无法响应正常信号),就可以使用kill -9来结束进程。
SIGINT (15)
系统会发送一个SIGTERM的信号给对应的程序。当程序接收到该signal后,将会发生以下的事情
1.程序立刻停止
2.当程序释放相应资源后再停止
3.程序可能仍然继续运行
大部分程序接收到SIGTERM信号后,会先释放自己的资源,然后在停止。但是也有程序可以在接受到信号量后,做一些其他的事情,并且这些事情是可以
配置的。如果程序正在等待IO,可能就不会立马做出相应。也就是说,SIGTERM多半是会被阻塞的、忽略.
注意:
init进程不可杀死
SIGINT信号不可被屏蔽
四、信号的发生
信号事件的发生有两个来源:硬件来源(比如我们按下了键盘或者其它硬件故障);软件来源,最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数,软件来源还包括一些非法运算等操作。
五、信号的响应
进程可以通过三种方式来响应一个信号:(1)忽略信号,即对信号不做任何处理,其中,有两个信号不能忽略:SIGKILL及SIGSTOP;(2)捕捉信号。定义信号处理函数,当信号发生时,执行相应的处理函数;(3)执行缺省操作,Linux对每种信号都规定了默认操作。注意,进程对实时信号的缺省反应是进程终止。
Linux究竟采用上述三种方式的哪一个来响应信号,取决于传递给相应API函数的参数。
七、Linux下信号编程举例
//Linux指令入门
http://c.biancheng.net/view/1068.html
参考文档
https://www.cnblogs.com/chinhao/p/4647861.html
https://blog.csdn.net/woxiaohahaa/article/details/52425469
2) SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
3) SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。
15) SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
19) SIGSTOP
停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略
原文地址:https://www.cnblogs.com/retry/p/11679301.html