页次: 1
我看网上说是会收到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”的内容
离线
取决于你的「退出终端」是什么意思。对于后台进程:
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
离线
退出终端的意思是直接关闭终端窗口。
在shell为bash的情况下,似乎并没有收到SIGHUP信号
离线
不知道跟终端仿真软件是不是有关,我用的是urxvt,
离线
有可能有关。关闭终端窗口时也许会发 SIGTERM?我不知道,strace 一下吧。如果 bash 收到 SIGHUP 的话,默认配置下它会给后台进程发一次。但是也许它没收到呢,或者你的配置有设置不要发。
离线
页次: 1