sigterm sigint sigkill 区别

http://www.mirecle.com/2010/05/20/sigterm-sigint-sigkill-difference.html

我看网上应该有不少搜索这个区别的问题,但是回答的都不全面,其中sigterm与sigint尤其有一点区别比较重要,但大都没有提及,今天我就遇到了这个问题,纠结了20分钟才搞明白咋回事。

首先,对于说这几个信号都是终止程序运行的说法不太准确,因为程序收到信号后,如果不对信号处理,就会导致程序退出,但如果程序捕获信号进行处理,按照它的逻辑,它是不一定会退出的。

在这三个信号中,sigkill是不能被捕获的,程序收到这个信号后,一定会退出。这就是kill -9一定能保证将程序杀死的原因。

下面说一下sigterm与sigint的区别,其中有一点区别区别很多文章都没有提及,也是我写这篇blog的原因(如果人家都写了,我就不用写了呗)

信号产生方式对进程的影响
sigint通过ctrl+c将会对当进程发送此信号信号被当前进程树接收到,也就是说,不仅当前进程会收到信号,它的子进程也会收到
sigtermkill命令不加参数就是发送这个信号只有当前进程收到信号,子进程不会收到。如果当前进程被kill了,那么它的子进程的父进程将会是init,也就是pid为1的进程

下面这两个代码片段就能够验证这种情况(注意使用pcntl的时候,一定要declare ticks,要不然会杯具的发现函数没有被调用,进程不退出,信号发过去没有作用。php手册竟然没有强调这一点):

文件:loadhelper.php

01#为了pcntl能够截获信号
02declare(ticks = 1);
03 
04$arr_processes array();
05 
06function terminate($signo){
07    echo "aaaaaaaaaaa/n";
08}
09 
10pcntl_signal(SIGTERM, "terminate", true);
11pcntl_signal(SIGINT, "terminate", true);
12 
13foreach($argv as $key => $operation){
14 
15    if(0 === $key){
16        continue;
17    }  
18 
19    $pipes array();
20    $process = proc_open($operationarray(), &$pipes);
21    if(false === $process){
22        exit(-1);
23    }
24    $arr_processes[] = $process;
25}
26 
27while(true){
28    sleep(100);
29}

文件:child.php

01declare(ticks=1);
02 
03pcntl_signal(SIGINT, "terminate");
04pcntl_signal(SIGTERM, "terminate");
05 
06function terminate($signo){
07    echo "test_child/n";
08}
09 
10while(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使进程进入了待回收状态,具体还 需要后续在分析一把。

--------------------------------------------------------------- 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值