文章目录
- 8. exit() 进程退出
-
- 8.1. exit() 系统调用的定义
- 8.2. do_exit() 函数
-
- 8.2.0. do_exit() 的参数和返回值
- 8.2.1. 检查和同步线程组退出
- 8.2.2. 清理与调试相关的资源
- 8.2.3. 取消 I/O 和信号处理
- 8.2.4. 检查线程组是否已终止
- 8.2.5. 释放系统资源
- 8.2.6. 释放线程和调度相关资源
- 8.2.7. 通知父进程
- 8.2.8. 减少进程栈引用计数,设置进程状态 DEAD 并切换进程
- 8.2.9. 进程消亡
- 8.2.10. put_task_stack() 释放内核栈
- 8.2.11. release_task_stack()
- 8.2.12. free_thread_stack()
- 8.2.13. thread_stack_delayed_free()
- 8.2.14. thread_stack_free_rcu()
- 8.2.15. try_release_thread_stack_to_cache()
- 8.3. do_exit() 函数小结
- 9. 阻塞等待退出
- 10. 进程退出为什么延时销毁?
- 11. 遗留问题
- #上一篇
- #下一篇
[注]:本篇文章与上一篇紧密相关,若未阅读上一篇请移步上一篇阅读,在文末可以找到上一篇链接。
8. exit() 进程退出
在了解完进程的创建流程后,我们也应该学习一下一个进程是如何退出操作系统的。相信大家都知道 exit()
系统调用,就是用来终止一个进程。它会清理进程的资源、通知父进程,并最终将进程从系统中移除。接下来就来仔细分析该函数。
8.1. exit() 系统调用的定义
exit()
系统调用的实现如下:
// Linux Kernel 6.15.0-rc2
// PATH: kernel/exit.c
SYSCALL_DEFINE1(exit, int, error_code)