ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

IPC信号

2019-10-15 18:03:54  阅读:348  来源: 互联网

标签:IPC SIGKILL 程序 SIGINT kill 信号 进程


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的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略

标签:IPC,SIGKILL,程序,SIGINT,kill,信号,进程
来源: https://www.cnblogs.com/retry/p/11679301.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有