当前位置: 首页 > news >正文

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:sighupreceived " ,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后父进程马上 退出。

相关文章:

  • IT技术的三个层次
  • Ruby connect to SQL server native client
  • Nmap使用方法
  • 系统蓝屏重起:如何修改设置,记录系统蓝屏重起的错误
  • Asp.Net应用程序配置Web.config
  • ubuntu9.10下构建tftp服务
  • WPF入门笔记
  • BusyBox 简化嵌入式 Linux 系统
  • 常用加密算法介绍--DES3
  • JDK1.6官方下载_JDK6官方下载_JDK1.6API(chm)下载_JDK6APICHM中文
  • 性能优化总结(五):CSLA服务端如何使用多线程的解决方案(转)
  • win7下使用matlab7.1,解决java错误提示。
  • 按时间自动关闭的弹出对话框
  • 在MTK上实现数独小游戏
  • 把javascript,vbscript中得数组传递给COM组件(or Activex)
  • 2019.2.20 c++ 知识梳理
  • Effective Java 笔记(一)
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java反射-动态类加载和重新加载
  • js面向对象
  • mysql innodb 索引使用指南
  • Spring声明式事务管理之一:五大属性分析
  • Vue 动态创建 component
  • 从零开始学习部署
  • 规范化安全开发 KOA 手脚架
  • 警报:线上事故之CountDownLatch的威力
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • ionic入门之数据绑定显示-1
  • ionic异常记录
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • (1)Android开发优化---------UI优化
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (done) 两个矩阵 “相似” 是什么意思?
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (第61天)多租户架构(CDB/PDB)
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (利用IDEA+Maven)定制属于自己的jar包
  • (顺序)容器的好伴侣 --- 容器适配器
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (五)MySQL的备份及恢复
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .apk 成为历史!
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net MVC4 上传大文件,并保存表单
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET4.0并行计算技术基础(1)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • /etc/shadow字段详解
  • @hook扩展分析