终止一个进程有很多方法(暂只说linux环境):前台运行的进程,如果没有提供退出功能,我们通常会Ctrl+C进行终止;后台或守护进程,如果也没有提供退出命令啥的,咱通常会kill掉;此外还有类似关机或重启之类的特殊情况,也会导致进程终止。

无论哪种方法,最终都是通过向进程传递信号量的方式进行终止。只是不同的方式发送的信号也不同:比如Ctrl+C发送的是SIGINT,kill和killall发送的是SIGTERM,kill -9发送的是SIGKILL,等等。

有些信号可以在程序中捕获,针对进行特殊处理;而有些则手动捕获不了或不能忽略,只能服从命令。

对于那些可以捕获到的终止类信号(如SIGTERM、SIGHUP、SIGINT等),就如同家长向正在玩仙剑的孩子说道:“玩儿一下午了,别玩了。”

如果碰到顽皮的,那么很可能就当作耳边风了——捕获到信号后选择不终止进程;

如果孩子还算听话,那么就赶紧把游戏存个档退出了——捕获到信号后做好收尾工作,然后终止进程(安全退出,推荐);

有的则图省事直接退出——不捕获信号或不做特殊处理,直接终止进程(大部分人都这么做,不推荐);

如果碰到的是个严厉的家长,二话不说直接上前把游戏关掉,这下孩子傻眼了“我擦,还没存档!!!”——接收到了不可被忽略的终止信号

另外还有一点需要注意,针对关机和重启的情况,是由操作系统按PID正序逐个发送SIGTERM,通知大家“做好准备,要关机了”,随后(n秒后)会下最后通谍——SIGKILL。对于子进程来说,父进程由于PID小,会先收到SIGTERM,收到后会立即向子进程发SIGKILL结束子进程。这样很可能会造成子进程接收不到操作系统发的SIGTERM,还未进行收尾工作就被终止。所以,还是尽量在主进程做收尾工作,或者主进程收到SIGTERM后主动向子进程发送SIGTERM(仅仅是这么想的,未验证 -.-)。

---------------------------------------------------分割线------------------------------------------------------------

附录:

网上的一段示例代码(Python)

#!/usr/bin/env python
import time
import signal
import sys NEEDEXIT=False
def SignalHandler(sig, id):
global NEEDEXIT
if sig == signal.SIGUSR1:
print 'received signal USR1'
elif sig == signal.SIGHUP:
print 'received signal HUP'
elif sig == signal.SIGTERM:
print 'received SIGTERM, shutting down'
NEEDEXIT = True signal.signal(signal.SIGUSR1, SignalHandler)
signal.signal(signal.SIGHUP, SignalHandler)
signal.signal(signal.SIGTERM, SignalHandler) while 1:
if NEEDEXIT:
sys.exit()
time.sleep(1)

  

Unix 让进程安全地退出的更多相关文章

  1. Unix守护进程

    问题描述:         Unix守护进程 问题解决:     Unix守护进程没有控制终端,终端名设置为问号(?),终端前台进程组ID设置(TPGID)为-1 守护进程编写规则:      (1) ...

  2. 编写Linux/Unix守护进程

    原文: http://www.cnblogs.com/haimingwey/archive/2012/04/25/2470190.html 守护进程在Linux/Unix系统中有着广泛的应用.有时,开 ...

  3. python学习笔记——多进程二 进程的退出

    1 进程的退出函数的基础语法 1.1 进程的退出函数 进程的退出含有有os._exit([status])和sys.exit([status])两种,从数据包来看,该退出模块仅在linux或者unix ...

  4. Nginx问题定位之监控进程异常退出

    nginx在运行过程中是否稳定,是否有异常退出过?这里总结几项平时会用到的小技巧. 1. 在error.log中查看是否有signal项,如果有,看看signal是多少. 比如,这是一个异常退出的情况 ...

  5. 是什么在.NET程序关闭时阻碍进程的退出?

    在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源.这个现象有时并不容易被察觉,但在 ...

  6. wxPython 对话框关闭后进程无法退出的原因

    wxPython中不要用对话框作为主程序wx.Dialog,这会导致程序关闭后进程无法退出.一种可行的做法是用wx.Frame代替

  7. linux进程解析--进程的退出及销毁

    一进程的退出: 当一个进程运行完毕或者因为触发系统异常而退出时,最终会调用到内核中的函数do_exit(),在do_exit()函数中会清理一些进程使用的文件描述符,会释放掉进程用户态使用的相关的物理 ...

  8. "php-cgi.exe - FastCGI 进程意外退出" 解决办法

    问题描述: win7下iis中php-cgi.exe - FastCGI 进程意外退出 错误提示: HTTP 错误 500.0 - Internal Server Error D:\phpStudy\ ...

  9. 【转载】IIS出现“HTTP 错误 500.0,C:\php\php-cgi.exe - FastCGI 进程意外退出”解决方法

    昨天给大家介绍了在windows+iis的平台上搭建支持php+mysql平台的文章,教程步骤都是笔者一步一个操作然后一个记录介绍给大家的,实机演练,教程绝对切实可用,但是不同的同学在不同的环境下按照 ...

随机推荐

  1. 2道acm简单题(2013):1.(时分秒)时间相减;2.主持人和N-1个人玩游戏,每个人说出自己认识的人数,判断其中是否有人说谎。

    /*1.题目:输入一个数,代表要检测的例子的个数,每个例子中:输入两个时间(格式HH:MM : SS),前面时间减去后面时间,输出在时钟上显示的时间,格式一样,如果是以为数字的前面补零.*//**思路 ...

  2. PAT1078 Hashing 坑爹

    思路:用筛法给素数打表,二次探测法(只需要增加的)–如果的位置被占,那么就依次探测. 注意:如果输入的,这也不是素数:如果,你需要打表的范围就更大了,因为不是素数. AC代码 #include < ...

  3. UVA - 11292 Dragon of Loowater 贪心

    贪心策略:一个直径为X的头颅,应该让雇佣费用满足大于等于X且最小的骑士来砍掉,这样才能使得花费最少. AC代码 #include <cstdio> #include <cmath&g ...

  4. HTTP协议报文结构及示例

    HTTP基本架构 下面我们用一张简单的流程图来展示HTTP协议基本架构,以便大家先有个基本的了解. 9.png Web Client可以是浏览器.搜索引擎.机器人等等一切基于HTTP协议发起http请 ...

  5. Spring IO Platform 解决Spring项目组合中版本依赖

    简介: Spring IO Platform是Spring官网中排第一位的项目.它将Spring的核心API集成到一个适用于现代应用程序的平台中.提供了Spring项目组合中的版本依赖.这些依赖关系是 ...

  6. 自动提取文章摘要AutoSummary

    在文本搜索引擎项目中,需要对已排序的文章进行摘要提取,然后与标题,路径一起封装成Json数据返回客户端.因此这里我自己写一个自动摘要,来大概完成这个任务.在自动摘要提取过程中,使用了一个分词库:Cpp ...

  7. supervessel-免费云镜像︱GPU加速的Caffe深度学习开发环境

    开发环境介绍 在SuperVessel云上,我们为大家免费提供当前火热的caffe深度学习开发环境.SuperVessel的Caffe有如下优点: 1) 免去了繁琐的Caffe环境的安装配置,即申请即 ...

  8. 笔记+R︱Logistics建模简述(logit值、sigmoid函数)

    本笔记源于CDA-DSC课程,由常国珍老师主讲.该训练营第一期为风控主题,培训内容十分紧凑,非常好,推荐:CDA数据科学家训练营 ---------------------------------- ...

  9. java Socket实现简单在线聊天(二)

    接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进 ...

  10. 把连续动态bmp转换为avi

    把动态bmp24转换为avi BYTE tmp_buf[1024*768*4]; //生成avi void BMPtoAVI(CString szAVIName, CString strBmpDir) ...