详谈UNIX环境进程异常退出

希望读者阅读此文后,对进程异常退出问题有更深层的认识,有更系统的梳理,对调试此类进程崩溃问题时也能有所帮助,写出更稳定、更可靠的软件。

进程异常退出

进程退出意味着进程生命期的结束,系统资源被回收,进程从操作系统环境中销毁。进程异常退出是进程在运行过程中被意外终止,从而导致进程本来应该继续执行的任务无法完成。

进程异常退出可能给软件用户造成如下负面影响:

软件丧失部分或者全部功能性,无法完成既定任务。 如果进程正在处理数据,可能造成数据损坏。 如果是关键软件服务,必然导致服务异常中止 , 造成无法
预计的损失。 进程异常退出或者进程崩溃 , 也会给软件用户造成恐慌和困惑。

进程异常退出是生产环境中经常遇到的问题,它会给软件用户造成很多负面影响,所以">软件开发者应当避免这种问题的出现。但是导致进程异常退出的场景和原因是多种多样的,甚至令人琢磨不透。

本文将所有可能造成进程异常退出的原因归结为两类。系统地将其分类,使读者对此类问题能有清晰的认识。对每类情况详细论述,分析根本原因,然后分析了这两类情况之间的联系,也就是信号与进程异常退出的紧密关系。希望您读完此文后,能对此类问题有更加全面、深入的理解,对调试此类问题也能有所帮助,写出更加可靠、更加稳定性、更加健壮的软件。

首先我们来看导致进程异常退出的这两类情况:

第一类:向进程发送信号导致进程异常退出; 第二类:代码错误导致进程运行时异常退出。

第一类:向进程发送信号导致进程异常退出

信号:

UNIX 系统中的信号是系统响应某些状况而产生的事件,是进程间通信的一种方式。信号可以由一个进程发送给另外进程,也可以由核发送给进程。

信号处理程序:

信号处理程序是进程在接收到信号后,系统对信号的响应。根据具体信号的涵义,相应的默认信号处理程序会采取不同的信号处理方式:

终止进程运行,并且产生 core dump 文件。 终止进程运行。
忽略信号,进程继续执行。 暂停进程运行。 如果进程已被暂停,重新调度进程继续执行。

前两种方式会导致进程异常退出,是本文讨论的范围。实际上,大多数默认信号处理程序都会终止进程的运行。

在进程接收到信号后,如果进程已经绑定自定义的信号处理程序,进程会在用户态执行自定义的信号处理程序;反之,内核会执行默认信号程序终止进程运行,导致进程异常退出。

图 1. 默认信号处理程序终止进程运行

所以,通过向进程发送信号可以触发默认信号处理程序,默认信号处理程序终止进程运行。在 UNIX 环境中11545.html">我们有三种方式将信号发送给目标进程,导致进程异常退出。

时间: 2024-07-29 06:51:46

详谈UNIX环境进程异常退出的相关文章

进程间共享内存 由于某个进程异常退出导致死锁

解决Nginx和Fpm-Php等内部多进程之间共享数据问题 概念说明: 1. MINIT:Php扩展的初始化方法,整个模块启动时候被调用一次 2. RINIT:Php扩展的初始化方法,每个请求会调用一次 3. ClusterMap(简称CM):提供服务定位和集群地图功能,通过接收心跳和主动探测方式收集节点状态信息,统一管理多种异构集群,替换硬负载均衡设备 4. CMSubProxy:ClusterMap内部的一个订阅者客户端代理,定期和Server端通讯,获取最新的集群信息,更新内部维护的机器列

解决openvpn进程异常退出的问题

最近的openvpn服务异常退出了多次,由于当初为了排查问题记录大量的debug日志,导致出现问题的时候想定位问题很难,瞬间日志就被刷没了,进程掉了,瞬间启动.瞬间又掉了,导致很多订单丢了!由于日子文件记录了太多无用信息,不敢通过查日志来定位问题,开始大胆猜测: 1. openvpn 服务器(虚拟机)的 内存不够了 因为只有 2G 内存 2. I/O过高,因为日志开启了 DEBUG 的原因,大量写日志操作, 3. 打开文件描述符不够,系统默认 1024 4. 有人恶意攻击openvpn 服务 根

子进程及时知道父进程已经退出的最简单方案

  [精彩] 子进程及时知道父进程已经退出的最简单方案? http://www.chinaunix.net 作者:yuonunix  发表于:2003-10-31 10:14:14 [发表评论] [查看原文] [C/C++讨论区][关闭] 要父进程知道子进程退出,这太容易了,但是要子进程知道父进程退出,可有点麻烦.       父进程如果退出,子进程如何知道呢,最笨的方法,父子进程之间建立socket连接,然后建立心跳,没隔1秒测试一把,当然太笨了,通过管道,可以吗?如何做?有更加简单的方法吗?

Unix环境下Oracle数据库完全优化详解

如今的优化己经向优化等待(waits)转型了,实际中性能优化最根本的出现点也都集中在IO,这是影响性能最主要的方面,由系统中的等待去发现Oracle库中的不足.操作系统某些资源利用的不合理是一个比较好的办法,本文测重于Unix环境. 一.通过操作系统的一些工具检查系统的状态,比如CPU.内存.交换.磁盘的利用率,根据经验或与系统正常时的状态相比对,有时系统表面上看起来看空闲这也可能不是一个正常的状态,因为CPU可能正等待IO的完成.除此之外我们还应观注那些占用系统资源(CPU.内存)的进程. 1

如何解决安装LIM Server软件时脚本异常退出的问题?

  故障现象: 安装LIM Server软件时,脚本异常退出,如下图: 原因分析: 安装脚本使用"ps"命令抓取"limserver"关键字来判断进程是否启动,如果主机名是limserver,则脚本会误认为进程启动,从而发生报错,中断安装; 此报错为lim3.0软件的问题,计划在3.2版本解决. 解决方案: 更改linux操作系统的hostname 为limsrv等,不要与limsever同名,安装成功,如下图:

c++-VS操作word,往文档中写入如几万条的数据后,保存然后释放资源关闭进程中,会出现进程未退出

问题描述 VS操作word,往文档中写入如几万条的数据后,保存然后释放资源关闭进程中,会出现进程未退出 VS操作word,往文档中写入如几万条的数据后,保存word,然后释放资源关闭winword.exe过程中,会出现winWord.exe未退出(数据量不大时操作是正常的),请教下,这有可能是什么原因,可否有方法解决?下列代码:void CWord::CloseApp(){ m_wdTable.ReleaseDispatch(); m_wdRange.ReleaseDispatch(); m_w

service-Android程序添加一个服务,如果程序遇到异常退出,则服务重启程序

问题描述 Android程序添加一个服务,如果程序遇到异常退出,则服务重启程序 在程序中添加一个服务,这个服务的功能包括: 1.在主程序启动时启动服务. 2.在主程序退出时退出服务 3.在主程序异常退出时负责重启主程序 4.当服务异常退出时主程序负责重启服务. 希望大家提供思路 解决方案 1.2,两点建立一对Activity(主程序)和Service,Activity创建时开启服务,Activity退出时关闭服务. 3.4,将主程序和服务放在两个进程中,分别开线程检测对方进程是否存在,如果不存在

linux. 线程 异常-linux线程异常退出问题。

问题描述 linux线程异常退出问题. linux进程(多条线程),其中有一个线程死循环没有执行任何操作(长期占用CPU 99%),linux系统有没有可能会干掉这条异常线程,但是整个进程没有退出? 求大神解答,没分- 解决方案 线程问题:空指针异常linux线程异常保护Linux进程.线程问题 解决方案二: 系统会直接杀进程.而不是线程 解决方案三: 对系统来说进程是软件运行的最小单位.所以会直接kill你这个进程.除非进程知道自己命不久矣,将会导致自己gg的线程给处理掉.

unix高级编程-UNIX环境高级编程 times() 疑问

问题描述 UNIX环境高级编程 times() 疑问 例程 int main(int argc, char *argv[]) { clock_t s_clk,e_clk; struct tms s_tms,e_tms; s_clk = times(&s_tms); system("ls /dev"); system("date"); sleep(1); e_clk = times(&e_tms); printf("e_clk %ld - s