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 : 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信号实现不重起程序即时生效

----------------------------------------------------------------------------------------------------------------------------

编程流程:

(1)注册SIGHUP的执行函数

(2)执行函数里书写一段程序代码,主要功能是重新读取配置文件里各项参数

操作流程:

(1)打开配置文件进行运行参数修改

(2)退出终端,则产生SIGHUP信号

(3)进程得到该信号后,去执行函数,所改即时生效

另外也可以使用socket实现运行参数即时生效,主要使用在底层配置参数存放到数据库,并且数据库操作

使用java等程序,这样使用socket非常方便。

转载于:https://www.cnblogs.com/langqi250/archive/2012/09/25/2702096.html

修改配置文件后不重启程序即时生效相关推荐

  1. 修改注册表后不重启计算机边生效(转)

    修改注册表后不重启计算机边生效. const int WM_SETTINGCHANGE = 0x001A; const int HWND_BROADCAST = 0xffff; IntPtr resu ...

  2. 修改注册表后不重启计算机,修改注册表后不重启计算机边生效(转)

    修改注册表后不重启计算机边生效. const int WM_SETTINGCHANGE = 0x001A; const int HWND_BROADCAST = 0xffff; IntPtr resu ...

  3. 修改注册表后不重启计算机,win10系统实现修改注册表不用重启就能生效的修复技巧...

    有关win10系统实现修改注册表不用重启就能生效的操作方法想必大家有所耳闻.但是能够对win10系统实现修改注册表不用重启就能生效进行实际操作的人却不多.其实解决win10系统实现修改注册表不用重启就 ...

  4. PHP 修改配置文件后重启命名

    centosPHP配置文件路径: /etc/php.ini 修改完配置文件后需要重启php服务: systemctl restart php-fpm 转载于:https://www.cnblogs.c ...

  5. 从配置文件(*.config)读到内存中,手动修改配置文件后,内存中数据改变问题.

    某些情况,我们把数据信息存储在*.xml或*.config文件中,存储在*.config中会比较安全,发布的程序,浏览器不会打开*.config文件,但是*.xml会在浏览器中呈现. 使用.confi ...

  6. Nginx入门3:Nginx常用命令;(启动nginx;启动时,指定配置文件;测试配置文件,查看当前使用的哪个配置文件;显示nginx版本;停止nginx;修改配置文件后,重载配置文件;)

    说明: (1)本篇博客介绍nginx常用的一些命令: 目录 一:启动Nginx:[/usr/sbin/nginx]: 1. 使用[/usr/sbin/nginx]去启动Nginx: 2.可以通过浏览器 ...

  7. 【MySQL】修改配置后,重启MySQL报错[ERROR] The server quit without updating PID file

    问题: 在没有修改配置时,MySQL启动正常: 错1:修改配置后MySQL启动不了,报错: [root@localhost mysql]# service mysql restart Starting ...

  8. Node.js笔记 - 修改文件后自动重启node服务

    每次修改代码后都要手动重启node服务,虽然不是复杂的事,但是每次都要这么搞一次颇为麻烦. 所以nodemon登场了! nodemon会监测你已运行程序中的文件和目录,一旦被修改,它会自动重启node ...

  9. vagrant 修改配置文件后,window 系统报错 0x80004005

    使用 vagrant 初始化虚拟机镜像后 一般还会在配置文件中,修改一下 ip 地址,方便虚拟机与主机之间的通信 但是,修改之后,vagrant reload 命令重启,发现: 不能为虚拟电脑打开一个 ...

最新文章

  1. Linq基础知识小记二
  2. 深度复盘:AI 与脑科学的错位
  3. “黑”掉神经网络:腾讯披露新型AI攻击手法,主流机器学习框架受影响
  4. 开发漫谈:RedMonk编程语言流行榜出炉
  5. linux怎么删除端口转发,linux使用rinetd快速实现端口转发
  6. 二分法(递归非递归)
  7. python合法变量类型_Python 变量类型
  8. Mybatis多条件直接查询
  9. 一个小白如何创建MYSQL数据表_MySQL小白扫盲(二)--建表、添加、查询
  10. 【数学】三角函数及部分微积分函数图象整理
  11. AIM Tech Round 5C. Rectangles 思维
  12. android ril移植,Quectel_Android_RIL_SR01A40V36 EC20安卓移植资料和相关代码 - 下载 - 搜珍网...
  13. 关于java方向的思考
  14. CentOS安装postgresql9.1
  15. linux输入子系统概述,4. Linux - 输入子系统框架详解
  16. 网站平台架构演变史(四) - 水平拆分的查询
  17. '转载'Tableau试用过后破解失败解决方法,清除注册表工具
  18. pyautogui获取鼠标位置及循环点击指定位置按钮
  19. 《Renewable Energy》论文格式
  20. 最新 9个免费建站空间 网站均免备案

热门文章

  1. 博客园北京俱乐部第二次技术活动(2009/4/4)总结
  2. (一)卡尔曼滤波算法简介
  3. Eclipse编译时函数报错:Undefined reference to 'pthread_create'
  4. 图像处理随笔——颜色空间
  5. git 取消head的游离状态
  6. java rsa加密 加签_RSA加密解密与加签验签
  7. c java 语法_java程序员要学的c语法
  8. django在window和linux,从windows导入Django项目到linux时出错
  9. java自动封箱_java自动封箱是什么意思
  10. 软件测试nextdata函数决策表,软件测试NextDate函数决策表测试法实验报告