linux 查看进程死亡原因,【进程管理】进程的死亡

本文详细分析了Linux内核中进程如何通过exit系统调用结束自己的生命周期,包括do_exit函数的关键步骤,如检查禁止结束的条件,释放资源,通知跟踪进程,以及调整进程状态。此外,还探讨了exit_notify函数如何通知其他进程进程死亡,以及do_notify_parent函数如何向父进程发送信号。整个过程涉及到信号处理、线程组管理和等待队列等核心概念。
摘要由CSDN通过智能技术生成

ARM Linux 源码分析系列文章基于 Linux 2.6.22 讲解,转载请标明原处!

一个进程可以使用exit系统调用来结束自己并进入僵死状态。他最后在内核中执行到的函数为sys_exit()。

fcb978a6c72e985b47b624fa2bc7ac2a.png

他调用do_exit()来执行真正的操作,实际上do_exit()涉及到很多其他内容,所以我们只讲解部分最为关键的代码,下面分析一下do_exit()函数。

3a8ec82c40732b71b13bce8f69d6d779.png

847行,取出要结束的进程(也就是当前进程)的进程描述符。

874行,in_interrupt()函数用来判断当前是否正在执行中断服务处理程序。exit()系统调用只能结束进程(线程),那么中断服务程序调用他是想结束谁呢?我们并不知道,因为我们并不知道中断会在什么时候发生,所以这里不允许在执行中断服务程序时调用到本函数。

876行,进程号(PID)为0的进程是idle进程,这个进程是系统中没有其他进程在执行时执行的函数,他不能被杀死。

879~882行,不允许杀死init进程。

6016fa2555747958897d718d5c02177a.png

887~889行,如果当前进程被跟踪且他需要报告给跟踪进程自己正在执行exit系统调用,那么就在888行把退出信号存放到ptrace_message字段,并在889行调用ptrace_notify()来通知跟踪进程我正在执行exit系统调用。

893行,如果当前进程在调用exit系统调用前已经正在执行删除操作了,那么就设置PF_EXITPIDONE 标志,并把当前进程的状态设为不可中断的暂停状态,这样他就不会再执行了,最后调度出去。

905行,设置PF_EXITING标志说明当前进程正在执行exit系统调用。

914~917行,只有线程的进程描述符的mm字段才为空,所以这里是:如果他是一个进程,那么就更新他的内存描述符。

918行,信号描述符是可以被进程共享的(比如说一个线程组内的所有进程都共享一个信号描述符),其共享的进程数存放在live字段里,而tsk进程都要被终结了,自然要递减他,说明少了一个使用这个描述符的进程。

919~922行,如果918行的live字段减为0了,就说明没有进程使用这个信号描述符了,那么剥离信号描述符中的所有定时器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值