博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
do_exit【转】
阅读量:6336 次
发布时间:2019-06-22

本文共 1473 字,大约阅读时间需要 4 分钟。

转自:

进程在退出时,必须释放它所拥有的资源,并通过某种方式告诉父进程。进程的退出一般是显示或隐式地调用了exit(),或者接受了某种信号。不过什么原因退出,最终都调用了do_exit。

 

 

 

用于进程退出的系统调用有两个exit和exit_group,exit只是终止某个进程,而exit_group整个线程中的进程。它们在内核中的服务函数分别为sys_exit和sys_exit_group,它们又分别调用了do_exit和do_group_exit。而do_group最终又调用了do_exit。

 

do_exit定义在kernel/exit.c中:

僵死进程:僵死进程是一个进程已经退出,它的内存和资源已经释放掉了,但是位了时系统在它退出后能够获得它的退出状态等信息,它的进程描述符仍然保留。

一个进程退出时,它的父进程会接收到一个SIGCHLD信号,一般情况下这个信号的处理函数会执行wait系列函数等待子进程的结束。从子进程退出到父进程调用wait(子进程结束)的这段时间,子进程称为僵死进程。执行ps –ef命令以“z”结尾的为僵死进程。

 

僵死进程很特殊,它没有任何可执行代码,不会被调度,只有一个进程描述符用来记录退出等状态,除此之外不再占用其他任何资源。

 

如果僵死进程的父进程没有调用wait,则该进程会一直处于僵死状态。如果父进程结束,内核会在当前线程组里为其找一个父进程,如果没找到则把init作为其父进程,此时新的父进程将负责清楚其进程。如果父进程一直不结束,该进程会一直僵死。在root下用kill -9 也不能将其杀死。

 

下面只对do_exit重点地方解析下:

 

struct task_struct *tsk = current;//获取当前要释放进程的进程描述符  
[cpp]   
 
  1. struct task_struct *tsk = current;//获取当前要释放进程的进程描述符  

 

 

[cpp] 
 
  1. exit_signals(tsk);  /* sets PF_EXITING 以免内和其他部分访问该进程*/  
[cpp]   
 
  1. exit_signals(tsk);  /* sets PF_EXITING 以免内和其他部分访问该进程*/  

 

 

exit_mm(tsk);  

  1.   
  2.     if (group_dead)  
  3.         acct_process();  
  4.     trace_sched_process_exit(tsk);  
  5.   
  6.     exit_sem(tsk);  
  7.     exit_files(tsk);  
  8.     exit_fs(tsk);  
  9.     check_stack_usage();  
  10.     exit_thread();  
[cpp]   
 
  1. exit_mm(tsk);  
  2.   
  3.     if (group_dead)  
  4.         acct_process();  
  5.     trace_sched_process_exit(tsk);  
  6.   
  7.     exit_sem(tsk);  
  8.     exit_files(tsk);  
  9.     exit_fs(tsk);  
  10.     check_stack_usage();  
  11.     exit_thread();  

 

/*更新父子关系,并告诉父进程正在退出*/  
  1.     exit_notify(tsk, group_dead);  
[cpp]   
 
  1. /*更新父子关系,并告诉父进程正在退出*/  
  2.     exit_notify(tsk, group_dead);  

 

 

最后要切换为其他进程

 

/*切换到其他进程*/  
  1.     schedule();  
[cpp]   
 
  1. /*切换到其他进程*/  
  2.     schedule();  

 

转载于:https://www.cnblogs.com/sky-heaven/p/5587288.html

你可能感兴趣的文章
PHPCMS V9数据库表结构分析
查看>>
理解 IEnumerable 与 IEnumerator
查看>>
NHibernate 2.0 Beta 1 Released和一些工具
查看>>
【每天一个Linux命令】12. Linux中which命令的用法
查看>>
软件接口数据一致性机制
查看>>
微服务架构介绍和RPC框架对比
查看>>
Debian下使用OpenLDAP 管理端
查看>>
泛型排序器TComparer
查看>>
9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...
查看>>
创建符合标准的、有语意的HTML页面——ASP.NET 2.0 CSS Friendly Control Adapters 1.0发布...
查看>>
Adobe驳斥Flash过度耗电论 称HTML5更耗电
查看>>
No!No!No! It's not fashion!
查看>>
艰困之道中学到的经验教训
查看>>
互联网生态建设落地五大挑战——保险科技生态建设 ...
查看>>
进行短视频app开发工作时,可以加入它来保护青少年 ...
查看>>
25G DAC无源高速线缆和25G光模块之间的区别
查看>>
乐乐茶完成近2亿元Pre-A轮融资,祥峰投资领投
查看>>
clickhouse修改时区
查看>>
CSS_定位
查看>>
第二十四章:页面导航(六)
查看>>