为什么80%的码农都做不了架构师?>>>   

linux中进程组织结构为session包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程。

一个session可能会有一个session首进程,而一个session首进程可能会有一个控制终端。一个进程组可能会有一个进程组首进程。( 这儿是可能会有,在一定情况之下是没有的)

进程组首进程的PID与该进程组ID相等。

与终端交互的进程是前台进程,否则便是后台进程。

SIGHUP会在以下3种情况下被发送给相应的进程:

1、终端关闭时,该信号被发送到首进程以及作为job提交的进程(即用 & 符号提交的进程)

2、session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程

3、若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。

系统对信号的默认处理是终止收到该信号的进程。

所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。

下面观察几种因终端关闭导致进程退出的情况,在这儿进程退出是因为收到了SIGHUP信号。

login shell是session首进程。

首先写一个测试程序,代码如下:

#include <stdio.h>
#include <signal.h>char **args;void exithandle(int sig)
{printf("%s : sighupreceived\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种情况, loginshell作为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。

同时孤儿进程属于后台进程,因此loginshell退出后不会发送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后父进程马上退出,这是C语言中实现daemon程序的常用技巧。

原文地址:http://springcamp.cn/linux/sighup-term/

转载于:https://my.oschina.net/hiease/blog/920410

让程序常驻后台运行的原理和方法相关推荐

  1. java语言写常驻服务_让程序常驻后台运行的原理和方法

    linux中进程组织结构为session包含一个前台进程组及一个或多个后台进程组,一个进程组包含多个进程. 一个session可能会有一个session首进程,而一个session首进程可能会有一个控 ...

  2. 用以促学——Linux进程后台运行的原理、方法、比较及其实现

    用以促学--Linux进程后台运行的原理.方法.比较及其实现 文章目录 用以促学--Linux进程后台运行的原理.方法.比较及其实现 前言 相关基础知识 应用场景 问题所在 linux概念说明 ses ...

  3. Linux——让程序在后台运行(四种方法+使用推荐)

    目录 一.第一种方法(加"&"符号) 二.第二种方法(nohup命令)  三.第三种方法(screen命令)   四.第四种方法(systemctl命令)   五.总结 六 ...

  4. 关于ios程序的后台运行

    文一  我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间.  还有三种类型的可以运行在后以,  1.音乐  2.location  3.v ...

  5. Ubuntu中如何使得程序在后台运行

    Ubuntu中如何使得程序在后台运行 一.前言 在Ubuntu中有的程序启动需要执行改程序./bin目录下的文件,并且启动之后这个shell就不能使用和关闭了,非常的麻烦,因此就有了相应的命令来解决这 ...

  6. 【iOS系列】-程序开启后台运行

    [iOS系列]-程序开启后台运行 iOS程序是伪后台的运行,可是有时候我们需要让其在后台也要进行一些操作,我们可以让其伪装成音乐的APP,这样就可以让程序后台进行相关操作了,具体做法如下: 1:在Ap ...

  7. 后台启动_Windows10中如何阻止程序在后台运行

    Windows用的越久速度越慢有多种原因,其中一个原因是安装了很多开机启动并驻留在内存中的程序.用户可以通过禁用这些后台程序来改善计算机运行的速度.有很多方法可以做到这一点,最简单的就是下载一个第三方 ...

  8. 【破事氵】在Linux环境中让程序在后台运行

    前言 首先,相信大家都或多或少了解过linux和云服务器.linux作为一个开源的操作系统内核,在开发者人群和服务器领域中有着很高的使用率.而现在在以阿里云为代表的云服务器商中,可以以很低的价格买入入 ...

  9. 阿里云后台运行python程序(后台运行scrapy爬虫)的方法

    1. 问题引入 通过Xshell工具连接远程阿里云服务器后,如何运行python程序呢?这个大家都知道,python命令啦. 举个栗子:通过Xshell在某个目录下输入命令:python test.p ...

最新文章

  1. MVC、MVP、MVVM
  2. 数据结构与算法 —— 二叉树
  3. swoole websocket服务
  4. 关于SWT中的布局Layout
  5. 打开360浏览器显示无法连接服务器,电脑360浏览器打不开网页是什么原因 检查一下是不网络问题...
  6. mysql oracle对空值_Oracle空值处理函数
  7. ObjC学习9-Foundation框架之数字、字符串和集合
  8. Spring中都用到了哪些设计模式
  9. oracle11g win10版本,win10系统安装的oracle11g和cloud6.2 创建数据中心报错
  10. bash脚本之case语句应用,while、until和select循环应用及其示例
  11. html5中的input(type=file)的multiple属性,实现多文件上传,并用js控制文件大小,数量
  12. 《Python核心编程》笔记 基础
  13. 兄弟FAX-2890更换硒鼓加粉清零方法
  14. 如何把几张图片合并成一张图片?
  15. 如何使用中国知网查询文献,并自动生成参考文献格式引文?
  16. html选择本地文件视频并播放器,使HTML5视频播放器播放不同的文件(Make a HTML5 video player play a different file)...
  17. 计算机的c盘是硬盘吗,笔记本固态硬盘是c盘吗_笔记本电脑SSD固态硬盘就是C盘吗-win7之家...
  18. 工信部于佳宁:区块链要服务实体经济
  19. 手机行业影像突破,谁能成为下一个“苹果”?
  20. 结合使用katex html2canvas 将LaTeX公式保存为图片

热门文章

  1. python编程入门课 视频教程-Python编程零基础入门课
  2. perl导入文本至mysql_Perl 脚本实现MySQL 异机导入导出-阿里云开发者社区
  3. RxJava响应式编程学习笔记
  4. 网络编程学习笔记(非阻塞accept)
  5. linux下截屏工具
  6. HDU2045 不容易系列之(3)—— LELE的RPG难题(递推)
  7. python中的控制流
  8. 通过自动回复机器人学Mybatis---加强版
  9. HDU3923-Invoker-polya n次二面体
  10. NET中winform与webform互相通讯实例,CS调用BS页面的JS函数---转载