当前位置: 技术问答>linux和unix
进程退出时哪些资源是必须释放的?
来源: 互联网 发布时间:2017-05-21
本文导语: 操作系统已经为进程分配了独立的地址空间,也就是说当进程退出时整个地址空间都不复存在。那么是不是除了共享的内存,匿名管道,其他的比如malloc出来的空间、socket描述符、epoll描述符、线程锁什么的都不用释放?还有...
操作系统已经为进程分配了独立的地址空间,也就是说当进程退出时整个地址空间都不复存在。那么是不是除了共享的内存,匿名管道,其他的比如malloc出来的空间、socket描述符、epoll描述符、线程锁什么的都不用释放?还有,为什么_exit()还要关闭文件描述符呢?
|
关于这个问题,我想应该不是一句话两句话能够解释清楚。来说说的我的理解和例子:
第一点:联想到了Windows,, 4.3.3节,在使用粗暴的TerminateProcess之后:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
虽然进程没有机会执行自己的清理工作(注:比如讲内存中的内容写入到文件中),但操作系统会在进程终止之后彻底进行清理,
确保不会泄露任何操作系统资源。这意味着进程使用的所有内存都会被释放,所有打开的文件都会被关闭,所有内核对象的使用计数都将递减,所有的用户对象和GDI对象都会被销毁。
一旦进程终止(不管是如何终止的),系统会保证不留它的任何部分。绝对没有任何办法知道那个进程是否运行过。进程在终止后绝对不会泄露任何东西。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
(2)Linux中,你所说的内存,epoll fd,socket fd等都会回收,但并不是所有在自己的应用程序中申请的资源都会回收。我曾经碰到过一个SystemV信号量,如果创建了信号量集合,但是程序退出前并不进行remove操作,即使程序 正常 退出了,系统的SystemV信号量仍然被占用。
(3)关于程序(包括多进程程序),最好还是自己做好资源的申请和释放。尤其关于您提到的这些资源,在程序中实现释放也并不会带来太多的劳力吧。
以上个人思路,继续讨论。
|
进程内的资源当进程销毁时都会被操作系统回收的,不会对系统有影响,不过能自己关闭就自己关闭(关闭时机不一样可能会导致结果不一致,假如是在多线程中)