您尚未登录。

#1 2018-04-20 22:56:59

lujun9972
会员
注册时间: 2016-10-21
帖子: 73

当退出终端时,后台运行的进程会收到SIGHUP信号吗?

我看网上说是会收到SIGHUP,导致后台进程被杀掉。
https://unix.stackexchange.com/question … disown-and


但是我自己实验了一下,发现后台进程似乎不会收到SIGHUP,也没有被杀掉。只是由于shell被干掉了所以父进程变成1了而已。

我的实验步骤如下:

先准备一个测试文件,代码如下

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

void sig_handler(int signo)
{
  if(signo == SIGHUP)
    {
      printf("RECV SIGHUP\n");
    }
  else
    {
      printf("RECV signal %d\n",signo);
    }
}

int main()
{
  signal(SIGHUP,sig_handler);
  sleep(180);
}

编译后在终端中执行
a.out >a.txt &

然后关闭终端,再打开新终端,查看a.txt没有发现有内容,用ps也能查到a.out没有被杀掉

但若在终端中执行
a.out >a.txt
然后关闭终端,再打开新终端,查看a.txt会发现有“RECV SIGHUP”的内容

离线

#2 2018-04-21 18:36:58

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,956
个人网站

Re: 当退出终端时,后台运行的进程会收到SIGHUP信号吗?

取决于你的「退出终端」是什么意思。对于后台进程:

1. 退出 bash,默认配置:不会。
2. 退出 zsh,默认配置:会。
3. 直接关闭终端窗口/软件,shell 为 bash 时:会。

对于前台进程,总是会收到内核发送的 SIGHUP。

参见:
https://blog.lilydjwg.me/2017/9/28/to-h … 10812.html To hup or not to hup - 依云's Blog
https://blog.lilydjwg.me/2016/6/12/sigh … 02219.html SIGHUP, nohup, disown 以及 expect + sudo + bash + ssh - 依云's Blog

离线

#3 2018-04-21 23:37:59

lujun9972
会员
注册时间: 2016-10-21
帖子: 73

Re: 当退出终端时,后台运行的进程会收到SIGHUP信号吗?

退出终端的意思是直接关闭终端窗口。
在shell为bash的情况下,似乎并没有收到SIGHUP信号

离线

#4 2018-04-21 23:40:29

lujun9972
会员
注册时间: 2016-10-21
帖子: 73

Re: 当退出终端时,后台运行的进程会收到SIGHUP信号吗?

不知道跟终端仿真软件是不是有关,我用的是urxvt,

离线

#5 2018-04-22 00:03:00

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,956
个人网站

Re: 当退出终端时,后台运行的进程会收到SIGHUP信号吗?

有可能有关。关闭终端窗口时也许会发 SIGTERM?我不知道,strace 一下吧。如果 bash 收到 SIGHUP 的话,默认配置下它会给后台进程发一次。但是也许它没收到呢,或者你的配置有设置不要发。

离线

页脚