SIGHUP信号相关
摘自:http://bbs.chinaunix.net/viewthread.php?tid=766356
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\n",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文件的内容为 front : sighup received
原因: sigtest是前台进程,终端关闭后,根据上面提到的第1种情况,
login shell作为session首进程,会收到SIGHUP信号然后退出,
根据第2种情况,sigtest作为前台进程,
会收到login shell发出的SIGHUP信号。
2、命令:sigtest back > tt.txt &
操作: 关闭终端
结果: tt文件的内容为 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后父进程马上退出
SIGHUP信号相关相关推荐
- SIGHUP信号与控制终端
SIGHUP信号与控制终端 UNIX中进程组织结构为 session (会话)包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程.一个session可能会有一个session首进程,而一 ...
- 关于SIGHUP信号的讨论
参考链接: <Linux终端关闭后台进程也结束原因分析和nohup的使用> <理解SIGHUP产生的过程> <Linux shell 退出后任务仍然运行引发的探究> ...
- 大话卫星导航中的信号处理系列文章——GPS信号相关特性
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 大话卫星导航中的信号处理系列文章--GPS信号相关特性 相关性 自相关性 互相关性 相关性 GPS L1C/A信号是BPSK调制信号, ...
- Unix/Linux编程:SIGHUP信号
当会话首进程打开了一个控制终端之后它同时也成为了该终端的控制进程:当一个控制进程失去其终端连接后,内核会向其发送一个SIGHUP信号来通知它这一事实(还会发送一个SIGCONT信号以确保当该进程之前被 ...
- linux下守护进程的创建和sighup信号
先来说下我理解的守护进程:守护进程没有控制终端,我觉得可以把它理解为一个后台进程. 本篇文章假设读者知道什么是进程组与会话. 下面看一下unix环境高级编程中守护进程的创建流程: 1.首先在进程中调用 ...
- nohup忽略SIGHUP信号
今天遇到一个问题:开启终端启动gunicorn进程后台运行,终端不关闭时,可以导入excel,关闭终端后,不能导入excel.原因是,xlrd模块需要向控制台输出内容,终端关闭后,控制台消失,无法输出 ...
- SIGHUP信号的作用以及守护进程为什么要忽略SIGHUP信号
SIGHUP信号的作用: 比如修改了 nginx 配置文件,希望不重启 nginx 就让配置生效,可以往 nginx 进程发一个 SIGHUP信号. 守护进程为什么要忽略SIGHUP信号? 首先创建一 ...
- Linux--信号signal、父子进程、SIGCHLD信号相关命令
目录 1.概念: 2.信号的存储位置: 3.常见的信号的值以及对应的功能说明: 4.信号的值在系统源码中的定义: 5.响应方式: 6.改变信号的相应方式: (1)设置信号的响应方式: (2)默认:SI ...
- TTL RGB信号相关 介绍最为详细 HSYNC VSYNC DE CLK
只要是数字信号处理电路,就必须有时钟信号.在液晶面板中,像素时钟是一个非常重要的时钟信号.像素时钟信号的频率与液晶面板的工作模式有关,液晶面板分辨率越高,像素时钟信号的频率也越高.在一行内,像素时钟的 ...
最新文章
- [转]ubuntu系统重新分区、根目录扩容
- python3多个变量赋值
- 使用SAP Spartacus快速创建一个电商店铺网站
- java的基础类型和字节大小_java的基础类型和字节大小
- mysql从库延时好高_部署MySQL延迟从库的几个好处
- 三层交换机启用OSPF后,如何实现数据转发路径
- 勒索软件再次降临 教育网为什么成为重灾区
- Latex——伪代码算法
- rk3399出现UART2串口打印异常问题
- mysql----------mysql5.7如何配置主从数据库
- NSMethodSignature, NSInvocation源码分析
- Spring整合MyBatis之MapperFactoryBean
- Python:threading(多线程操作)(转载)
- JS原生读取 本地 JSON
- html动画人物走路,动画人物走路教程
- android-studio安装及android开发环境搭建
- 裂变新玩法 2022年京东双十一红包如何领取?
- C语言指针理解(一)
- python 实现日期计算器
- 创建pv卷报错excluded by a filter的解决办法
热门文章
- Strawberry Wallpaper:海量5K高清大图壁纸下载工具
- 修改Linux时间一般涉及到3个命令: date, clock, hwclock
- php 浏览器打开excel文件夹里,php网页显示excel表格数据-phpexcel 读取excel里的数据并在页面显示出来...
- “易融窃贼”--网贷平台隐私窃取
- 计算机word保存如何操作,电脑word怎么保存 在电脑上word打字怎么保存
- java实现的一个发送手机短信
- Bonecraft 界面汉化补丁
- 动人的牵线美的连接符-两张表的查询(一)
- 解决imageview 不显示图片问题
- 【每日一题】打卡 24