窥探 kernel,just for fun --- 浅析do_exit
2012-04-28 20:47
316 查看
本系列文章由张同浩编写,转载请注明出处:/article/1391219.html
邮箱:muge0913@sina.com
进程在退出时,必须释放它所拥有的资源,并通过某种方式告诉父进程。进程的退出一般是显示或隐式地调用了eixt(),或者接受了某种信号。不过什么原因退出,最终都调用了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重点地方解析下:
[cpp] view
plaincopyprint?
struct task_struct *tsk = current;//获取当前要释放进程的进程描述符
[cpp] view
plaincopyprint?
exit_signals(tsk); /* sets PF_EXITING 以免内和其他部分访问该进程*/
[cpp] view
plaincopyprint?
exit_mm(tsk);
if (group_dead)
acct_process();
trace_sched_process_exit(tsk);
exit_sem(tsk);
exit_files(tsk);
exit_fs(tsk);
check_stack_usage();
exit_thread();
[cpp] view
plaincopyprint?
/*更新父子关系,并告诉父进程正在退出*/
exit_notify(tsk, group_dead);
最后要切换为其他进程
[cpp] view
plaincopyprint?
/*切换到其他进程*/
schedule();
邮箱:muge0913@sina.com
进程在退出时,必须释放它所拥有的资源,并通过某种方式告诉父进程。进程的退出一般是显示或隐式地调用了eixt(),或者接受了某种信号。不过什么原因退出,最终都调用了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重点地方解析下:
[cpp] view
plaincopyprint?
struct task_struct *tsk = current;//获取当前要释放进程的进程描述符
[cpp] view
plaincopyprint?
exit_signals(tsk); /* sets PF_EXITING 以免内和其他部分访问该进程*/
[cpp] view
plaincopyprint?
exit_mm(tsk);
if (group_dead)
acct_process();
trace_sched_process_exit(tsk);
exit_sem(tsk);
exit_files(tsk);
exit_fs(tsk);
check_stack_usage();
exit_thread();
[cpp] view
plaincopyprint?
/*更新父子关系,并告诉父进程正在退出*/
exit_notify(tsk, group_dead);
最后要切换为其他进程
[cpp] view
plaincopyprint?
/*切换到其他进程*/
schedule();
相关文章推荐
- 窥探 kernel,just for fun --- do_fork
- 窥探 kernel,just for fun --- task_struct
- 窥探 kernel --- 浅析do_exit
- 窥探 kernel,just for fun --- sys_fork,sys_vfork,sys_clone,kernel_thread
- 窥探 kernel,just for fun --- copy_process
- 窥探 kernel - 浅析do_exit
- 窥探 kernel,just for fun --- 内核线程
- 窥探 kernel,just for fun --- 有关系统调用的几个知识点
- 窥探 kernel,just for fun --- 系统调用在用户空间的访问
- 窥探 kernel,just for fun --- 系统调用在用户空间的访问
- 窥探 kernel,just for fun --- 系统调用过程分析
- 窥探 kernel,just for fun --- 有关系统调用的几个知识点
- 窥探 kernel,just for fun --- 分析sys_reboot
- 窥探 kernel,just for fun --- sys_fork,sys_vfork,sys_clone,kernel_thread
- 窥探 kernel,just for fun --- 动手添加系统调用(ARM)
- just for fun
- Just FOR FUN
- Start game physics reading, just for fun
- 我不是程序员! Just coding for fun!
- 在控制台界面中显示图像-just for fun