sigterm sigint sigkill 区别
2011-06-01 15:40
501 查看
我看网上应该有不少搜索这个区别的问题,但是回答的都不全面,其中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 区别 .
- sigterm sigint sigkill 区别
- Linux信号SIGTERM、SIGKILL、SIGINT和SIGQUIT的区别
- SIGINT、SIGQUIT、 SIGTERM、SIGSTOP区别
- Linux中与进程终止相关的信号SIGTERM,SIGKILL,SIGINT
- SIGINT,SIGQUIT,SIGTERM等终止进程信号的区别
- sigint sigterm 的区别
- sigint sigterm 有什么区别啊
- SIGTERM、SIGKILL、SIGINT和SIGQUIT的区别
- linux信号 SIGINT SIGTERM SIGKILL
- sigint sigterm 的区别
- SIGTERM、SIGKILL、SIGINT和SIGQUIT的区别
- sigint\sigterm\sigkill
- SIGTERM和SIGINT的含义
- 信号 解释 / SIGSTERM SIGKILL 区别
- 在qt程序中捕捉linux信号,sigint sighup sigterm
- SIGTERM, SIGSEGV, SIGINT, SIGILL, SIGABRT, SIGFPE
- 信号SIG_TERM与信号SIG_KILL
- emerge --sync时出现rsync error:received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(503)
- SIGTERM SIGINT