`
f543711700
  • 浏览: 322541 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

SIGHUP信号与控制终端

阅读更多
SIGHUP信号与控制终端
UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。进程组首进程的进程ID与该进程组ID相等。这儿是可能会有,在一定情况之下是没有的。与终端交互的进程是前台进程,否则便是后台进程。

SIGHUP会在以下3种情况下被发送给相应的进程:
  1、终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)
  2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程
  3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。

系统对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后父进程马上退出。
分享到:
评论

相关推荐

    php 中的信号处理操作实例详解

    本文实例讲述了php 中的信号处理操作。分享给大家供大家参考,具体如下: 首先我们需要了解几个函数 ...通知同一session内的各个作业, 这时它们与控制终端不再关联。 SIGINT 程序终止(interrupt)信号, 在用户键入IN

    nohup和&的区别

    • 关闭session发送SIGHUP信号,程序关闭 使用nohup运行程序: • 结果默认会输出到nohup.out • 使用Ctrl + C发送SIGINT信号,程序关闭 • 关闭session发送SIGHUP信号,程序免疫 平日线上经常使用nohup和&配合...

    UNIX_信号说明1

    )[+]Unix信号列表下面是一些信号说明Unix信号列表1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP

    Linux下基于socket多线程并发通信的实现

    Linux下基于socket多线程并发通信的实现,论文,pdf文档

    Linux函数和脚本

    1.1 SIGHUP 2.2 SIGINT 3.3 SIGQUIT 4.4 SIGILL 5.5 SIGTRAP 6.6 SIGABRT 7.7 SIGBUS 8.8 SIGFPE 9.9 SIGKILL 10.10 SIGUSR1 11.11 SIGSEGV 12.12 SIGUSR2 13.13 SIGPIPE 14.14 SIGALRM 15.15 SIGTERM 16.17 SIGCHLD...

    编写daemon进程,检测信号实现功能

    当检测到SIGHUP(远程挂断)信号时,该进程获得系统运行时间(读取/proc/uptime文件,该文件第一列为系统启动到现在的时间(以秒为单位),第二列为系统空闲的时间(以秒为单位)),将其追加写入日志文件。...

    零停重启程序工具Huptime研究

    零停重启目标程序,比如一个网络服务程序,不用丢失和中断任何消息实现重新启动,正在处理的消息也不会中断和丢失,重启的方法是给目标程序的进程发SIGHUP信号。

    servermon:响应进程信号的服务器

    这在需要监视文件更改并向 docker 容器发送 SIGHUP 信号以动态重新加载子进程的 docker 工作流中特别有用。 使用集群创建“children”指定的子进程 如果子进程因错误退出,则重新启动子进程 响应发送到主进程的 ...

    laravel中Redis队列监听中断的分析

    1、linxu挂起队列监听 ... 2、发现问题(日志) ... The process has been sinaled with signal "1". ...终端挂起或者控制进程终止 SIGINT 2 A 键盘中断(如break键被按下) SIGQUIT 3 C 键盘的退出键被按

    浅析Linux中使用nohup及screen运行后台任务的示例和区别

    使用SSH终端(比如putty,xshell)连接Linux服务器上运行比较耗时任务,可能需要几个... 可见,使用&后台运行的进程会被SIGHUP2信号中止,但是你如果用exit命令正常退出终端,程序将继续运行在后台不会中止。 nohup com

    linux信号量说明

    1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR213) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD18) SIGCONT ...

    config:Go Go的配置库,可解析环境变量,JSON文件,并在SIGHUP上自动重新加载

    Go的一个小型配置库,该库可以解析环境变量,JSON文件,并自动在SIGHUP上重新加载。 例 func main () { c := config . New ( "config.json" ) http . HandleFunc ( "/" , func ( w http. ResponseWriter , r * ...

    用c语言实现HUP信号重启进程的方法

    代码如下所示: 代码如下:#include &lt;stdio&gt;#include &lt;string&gt;#include &lt;stdlib&gt;#include ...void sighup_handler(int sig);// argv[0] 尽量使用绝对路径, 因为程序执行过程中可能会使用 chdir() .int main(int ar

    嵌入式流媒体客户端软件的设计

    流式视频传输。...或者 DiractX 作为视频输出,使用 OSS、ALSA 和 ESD 作为音频输出。VLC 扫描步骤:1)探测 cpu 型号与功能...8)安装信号处理器:SIGHUP,SIGINT 和 SIGQUIT(捕获一个,忽略后来的并退出);9)派生音频输出线

    consulr:将Consul KV数据解码为Node.js中的JSON并查看更新

    重要的 :warning: :warning: :warning: 该项目的目的是为nodejs应用程序提供额外的功能,例如动态配置更改,而无需SIGHUP信号或手动重启。 因此,不同的解决方案都有其自身的优势。 这意味着没有主张使用consulr...

    Linux高性能服务器编程

    10.5.1 SIGHUP 10.5.2 SIGPIPE 10.5.3 SIGURG 第11章 定时器 11.1 socket选项SO_RCVTIMEO和SO_SNDTIMEO 11.2 SIGALRM信号 11.2.1 基于升序链表的定时器 11.2.2 处理非活动连接 11.3 IO复用系统调用的超时...

    windows 上的安装Memcached及Memcached配置

    安装Memcached及Memcached配置

    semeru:一个用于 Linux 的简单 Java 启动加载器

    塞梅鲁Semeru 是一个小型 Java 启动器,用于执行以下任务: 提供一种对 Java 程序中的 SIGINT、SIGTERM 和可选的 SIGHUP 信号作出React的方法。 在切换到另一个用户之前,为进程设置特定的 Linux 功能。 该程序不...

    slick-pg_core_2.10-0.5.1.3.zip

    daemon-java.zip,通过sighup实现重载挂钩的类通过sighup实现重载挂钩的java类

    linux nohup及tail-f用法

    描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令...

Global site tag (gtag.js) - Google Analytics