zoukankan      html  css  js  c++  java
  • SIGHUP

    系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
     
    下面观察几种因终端关闭导致进程退出的情况,在这儿进程退出是因为收到了SIGHUP信号。login shell是session首进程。
     
    首先写一个测试程序,代码如下:
    #include <stdio.h>
    #include <signal.h>
    char **args;
    void exithandle(int sig)
    ...{
           printf("%s : sighup received ",args[1]);
    }
    int main(int argc,char **argv)
    ...{
           args = argv;
           signal(SIGHUP,exithandle);
           pause();
           return 0;
    }
    程序中捕捉SIGHUP信号后打印一条信息,pause()使程序暂停。
    编译后的执行文件为sigtest。
     
    1、命 令:sigtest front > tt.txt
       操 作:关闭终端
       结 果:tt.txt文件的内容为front : sighup received
       原 因: sigtest是前台进程,终端关闭后,根据上面提到的第1种情况,login shell作为session首进程,会收到SIGHUP信号然后退出。根据第2种情况,sigtest作为前台进程,会收到login shell发出的SIGHUP信号。
     
    2、命 令:sigtest back > tt.txt &
          操 作:关闭终端
          结 果:tt.txt文件的内容为 back : sighup received
          原 因: sigtest是提交的job,根据上面提到的第1种情况,sigtest会收到SIGHUP信号。
     
    3、命 令:写一个shell,内容为[sigtest &],然后执行该shell
          操 作:关闭终端
          结 果:ps -ef | grep sigtest 会看到该进程还在,tt文件为空
          原 因: 执行该shell时,sigtest作为job提交,然后该shell退出,致使sigtest变成了孤儿进程,不再是当前session的job了,因此sigtest即不是session首进程也不是job,不会收到SIGHUP。同时孤儿进程属于后台进程,因此login shell退出后不会发送SIGHUP给sigtest,因为它只将该信号发送给前台进程。第3条说过若进程组变成孤儿进程组的时候,若有进程处于停止状态,也会收到SIGHUP信号,但sigtest没有处于停止状态,所以不会收到SIGHUP信号。
     
    4、命 令:nohup sigtest > tt
          操 作:关闭终端
          结 果:tt文件为空
          原 因: nohup可以防止进程收到SIGHUP信号
     
    至此,我们就清楚了何种情况下终端关闭后进程会退出,何种情况下不会退出。

    要想终端关闭后进程不退出有以下几种方法,均为通过shell的方式:
     1、编写shell,内容如下
           trap "" SIGHUP #该句的作用是屏蔽SIGHUP信号,trap可以屏蔽很多信号
           sigtest
     2、nohup sigtest 可以直接在命令行执行,
           若想做完该操作后继续别的操作,可以 nohup sigtest &
     3、编写shell,内容如下
           sigtest &
           其实任何将进程变为孤儿进程的方式都可以,包括fork后父进程马上退出。

  • 相关阅读:
    我为什么支持从中学课本中撤下鲁迅的文章?
    【老孙随笔】技术不行别人就不服你,怎么办?
    【老孙随笔】求职,不要无的放矢
    读者来信(1)——项目经理,不要迷信制度!
    欣闻鲁迅文章下架
    知道力读书会,欢迎大家参加
    【老孙随笔】是谁杀死了QQ?
    技术,项目经理的命?——项目经理的误区(3)
    可以不封神,但是不能不修炼——亚特兰蒂斯之神特斯拉的启示
    分布式开发2WCF如何正确调用LINQTO SQL
  • 原文地址:https://www.cnblogs.com/greencolor/p/2358866.html
Copyright © 2011-2022 走看看