我看网上应该有不少搜索这个区别的问题,但是回答的都不全面,其中sigterm与sigint尤其有一点区别比较重要,但大都没有提及,今天我就遇到了这个问题,纠结了20分钟才搞明白咋回事。 首先,对于说这几个信号都是终止程序运行的说法不太准确,因为程序收到信号后,如果不对信号处理,就会导致程序退出,但如果程序捕获信号进行处理,按照它的逻辑,它是不一定会退出的。 在这三个信号中,sigkill是不能被捕获的,程序收到这个信号后,一定会退出。这就是kill -9一定能保证将程序杀死的原因。 下面说一下sigterm与sigint的区别,其中有一点区别区别很多文章都没有提及,也是我写这篇blog的原因(如果人家都写了,我就不用写了呗) 信号 产生方式 对进程的影响 sigint 通过ctrl+c将会对当进程发送此信号 信号被当前进程树接收到,也就是说,不仅当前进程会收到信号,它的子进程也会收到 sigterm kill命令不加参数就是发送这个信号 只有当前进程收到信号,子进程不会收到。如果当前进程被kill了,那么它的子进程的父进程将会是init,也就是pid为1的进程 下面这两个代码片段就能够验证这种情况(注意使用pcntl的时候,一定要declare ticks,要不然会杯具的发现函数没有被调用,进程不退出,信号发过去没有作用。php手册竟然没有强调这一点): 文件:loadhelper.php view sourceprint?01 #为了pcntl能够截获信号 02 declare(ticks = 1); 03 04 $arr_processes = array(); 05 06 function terminate($signo){ 07 echo "aaaaaaaaaaa/n"; 08 } 09 10 pcntl_signal(SIGTERM, "terminate", true); 11 pcntl_signal(SIGINT, "terminate", true); 12 13 foreach($argv as $key => $operation){ 14 15 if(0 === $key){ 16 continue; 17 } 18 19 $pipes = array(); 20 $process = proc_open($operation, array(), &$pipes); 21 if(false === $process){ 22 exit(-1); 23 } 24 $arr_processes[] = $process; 25 } 26 27 while(true){ 28 sleep(100); 29 } 文件:child.php view sourceprint?01 declare(ticks=1); 02 03 pcntl_signal(SIGINT, "terminate"); 04 pcntl_signal(SIGTERM, "terminate"); 05 06 function terminate($signo){ 07 echo "test_child/n"; 08 } 09 10 while(true){ 11 sleep(100); 12 } 使用命令php loadhelper.php “php test.php”可以启动这个测试。 1.输入ctrl+c发送sigint可以看到,父进程与子进程的terminate都得到了执行,都有输出,但父进程不会退出,因为子进程还没有退出 2.通过kill向父进程的pid发送sigterm,可以看到,只有父进程输出 遗留问题: 父进程(loadhelper)接受到一次信号后,如果在terminate函数中调用exit,它还是不能退出的,因为还有子进程没有退出。但是从此以后它就不能再接收信号了(子进程还是能够接收到sigint),可能是exit使进程进入了待回收状态,具体还 需要后续在分析一把。 原文地址:http://www.mirecle.com/2010/05/20/sigterm-sigint-sigkill-difference.html ---------------------------------------------------------------

sigterm sigint sigkill 区别相关推荐

  1. SIGQUIT/SIGTERM/SIGINT/SIGKILL四种信号的区别

    SIGQUIT/SIGTERM/SIGINT/SIGKILL四种信号的区别 SIGQUIT: SIGTERM: SIGINT: SIGKILL: SIGQUIT: 在POSIX兼容的平台,SIGQUI ...

  2. SIGINT,SIGKILL,SIGTERM信号区别,各类信号总结

    SIGINT,SIGKILL,SIGTERM 三者都是结束/终止进程运行.但略微有区别. SIGINT 产生方式: 键盘Ctrl+C 产生结果: 只对当前前台进程,和他的所在的进程组的每个进程都发送S ...

  3. SIGTERM SIGINT

    SIGHUP     终止进程     终端线路挂断 SIGINT     终止进程     中断进程 SIGQUIT   建立CORE文件终止进程,并且生成core文件 SIGILL   建立COR ...

  4. UNIX系统关机发送SIGTERM和SIGKILL信号流程

    UNIX系统关机发送SIGTERM和SIGKILL信号流程 UNIX系统关机时,init进程通常先给所有进程发送SIGTERM信号(该信号可被捕获),等待一段固定的时间(往往在5到20秒时间),然后给 ...

  5. SIGTERM、SIGKILL、SIGINT和SIGQUIT的区别

    1. SIGQUIT: 在POSIX兼容的平台,SIGQUIT是其控制终端发送到进程,当用户请求的过程中执行核心转储的信号. SIGQUIT通常可以ctrl+ \.在Linux上,人们还可以使用Ctr ...

  6. SIGTERM等信号含义【转】

    主要是做sigterm 和sigkill区别的比较,之前的好多操作,在结束正在运行的一个程序的时候,常用kill,这个以后的注意,在sigterm不起作用的时候,再使用kill; 原文地址:http: ...

  7. PG内核分析 Question and Answer

    PG内核分析 Question and Answer PG系统概述 为什么说PG是一种先进的对象-关系数据库系统 因为PG它不仅支持关系数据库的各种功能, 而且还具备类, 继承等对象数据库的特征. 面 ...

  8. SIGINT、SIGKILL、SIGTERM 信号区别

    三者都是结束 / 终止进程运行,但略微有区别. 一.SIGINT 产生方式:键盘 Ctrl + C 产生结果:只对当前前台进程和他的所在的进程组的每个进程都发送 SIGINT 信号,之后这些进程会执行 ...

  9. SIGINT、SIGKILL和SIGTERM的区别

      首先要知道的是SIGINT.SIGKILL和SIGTERM代表的时一种信号.什么是信号?信号是一个 POSIX 内部通信系统:发送通知给进程,以告知其发生的事件.(windows系统不支持). 这 ...

最新文章

  1. 亚马逊刊登php代码,最全的亚马逊刊登listing工具了解一下
  2. 谷歌新作:视觉Transformer超越ResNet!!!从头开始训练!
  3. SQL Server查询某字段在哪些表中
  4. jquery的四层联动插件jquerySelect
  5. History命令用法
  6. 可变参数的使用之va_arg的陷阱s
  7. Activity service 通信
  8. 工业以太网在工业控制中的运用
  9. mysql 数据修改时间_怎样修改mysql数据中的具体时间
  10. 中学计算机教育特点,中学信息技术考点:信息的概念和基本特征
  11. python网络爬虫开发从入门到精通_Python突击-从入门到精通到项目实战
  12. c oracle 存储图片,用c语言如何读取和保存jpg图片文件?
  13. 梯度锐化拉普拉斯锐化比较_锐化斧头
  14. Android开发 BufferedWriter写入报错怎么办 啊
  15. 如何解决微软自带输入法突然变成繁体
  16. 深度学习计算框架综述(一)行业内计算框架总览
  17. java 并g1_JVM G1详解
  18. variance和variation的区别
  19. html文本框怎么加粗,html怎么让字体加粗
  20. uniapp开发微信小程序,多行文本换行,动态改变文字区域宽度

热门文章

  1. opencv 调整窗口大小_opencv改变imshow窗口大小,窗口位置的方法
  2. everything文件搜索_本地文件搜索神器,Everything、Listary、AnyTXT Searcher!
  3. java小程序例子_「小程序JAVA实战」java的聚合项目搭建(30)
  4. mysql节假日表_节假日常见的数据库磁盘空间处理小结
  5. php数据库重复记录数,php – 每隔30分钟计算一次数据库上的重复...
  6. C++知识点53——虚继承
  7. jquery ready 与资源加载顺序
  8. swift3 0 Alamofire下载文件
  9. 开启mysql远程访问的权限
  10. linux基础(day19)