进程退出时哪些资源是必须释放的?

JamesWatson 2014-06-24 10:40:07
操作系统已经为进程分配了独立的地址空间,也就是说当进程退出时整个地址空间都不复存在。那么是不是除了共享的内存,匿名管道,其他的比如malloc出来的空间、socket描述符、epoll描述符、线程锁什么的都不用释放?还有,为什么_exit()还要关闭文件描述符呢?
...全文
2090 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
静之深 2014-06-25
  • 打赏
  • 举报
回复
加入系统没有close文件描述符的话,系统是不会保存文件内容的
静之深 2014-06-25
  • 打赏
  • 举报
回复
这个是取决于应用自己的,其可能想在进程退出时,做一些额外的动作。当然其也可已不用关闭文件描述符。 例证:

#include <stdlib.h>
#include <stdio.h>

FILE *fp=NULL;

void fn1()
{
    char buf[32]="atexit";

    if(NULL!=fp){
        fwrite(buf,sizeof(buf),1,fp);
        printf("fwrite *****\n");
    }
    printf("calling fn2*****\n");
}

int main()
{
    char *path="./file.txt";

    atexit(fn1);

    if(NULL==(fp=fopen(path,"w+"))){
        printf("fp is null *****\n");
        return 0;
    }
    //fclose(fp);
    printf("calling main *****\n");

    return 0;
}


yingc@yingc:~/gcyin/test/tmp/csdn$ ls
cond.c  condtest  exit.c  filetest  filetest.c  file.txt  libtestlib.a  main  main.cpp  main.o  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ cat file.txt 
yingc@yingc:~/gcyin/test/tmp/csdn$ ls
cond.c  condtest  exit.c  filetest  filetest.c  file.txt  libtestlib.a  main  main.cpp  main.o  testlib.cpp  testlib.h  testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ gcc -o exit exit.c 
yingc@yingc:~/gcyin/test/tmp/csdn$ ll
total 1172
drwxrwxr-x  2 yingc yingc    4096  6月 25 10:44 ./
drwxrwxr-x 19 yingc yingc    4096  6月 16 16:43 ../
-rw-rw-r--  1 yingc yingc    1215  5月 30 10:49 cond.c
-rwxrwxr-x  1 yingc yingc    7410  5月 30 10:49 condtest*
-rwxrwxr-x  1 yingc yingc    7389  6月 25 10:44 exit*
-rw-rw-r--  1 yingc yingc     856  6月 25 10:44 exit.c
-rw-r--r--  1 yingc yingc   12288  6月 25 10:44 .exit.c.swp
-rwxrwxr-x  1 yingc yingc    7443  5月 30 14:53 filetest*
-rw-rw-r--  1 yingc yingc     825  5月 30 14:53 filetest.c
-rw-rw-r--  1 yingc yingc       0  5月 30 14:49 file.txt
-rw-rw-r--  1 yingc yingc    2706  5月 29 16:49 libtestlib.a
-rwxrwxr-x  1 yingc yingc 1117061  5月 29 17:13 main*
-rw-rw-r--  1 yingc yingc     520  5月 28 10:49 main.cpp
-rw-rw-r--  1 yingc yingc    2176  5月 29 17:13 main.o
-rw-rw-r--  1 yingc yingc     586  5月 29 16:44 testlib.cpp
-rw-rw-r--  1 yingc yingc     661  5月 29 16:44 testlib.h
-rw-rw-r--  1 yingc yingc    2532  5月 29 16:49 testlib.o
yingc@yingc:~/gcyin/test/tmp/csdn$ ./exit 
calling main *****
fwrite *****
calling fn2*****
yingc@yingc:~/gcyin/test/tmp/csdn$ cat file.txt 
atexityingc@yingc:~/gcyin/test/tmp/csdn$ fg




  • 打赏
  • 举报
回复
引用 3 楼 xosion 的回复:
我要是留一堆那种调用内核的句柄,比如epoll, socket, 动态库指针, 文件锁之类的不关闭, 不会对系统产生影响吧?
关于这个问题,我想应该不是一句话两句话能够解释清楚。来说说的我的理解和例子: 第一点:联想到了Windows,<<Windows核心编程>>, 4.3.3节,在使用粗暴的TerminateProcess之后: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 虽然进程没有机会执行自己的清理工作(注:比如讲内存中的内容写入到文件中),但操作系统会在进程终止之后彻底进行清理, 确保不会泄露任何操作系统资源。这意味着进程使用的所有内存都会被释放,所有打开的文件都会被关闭,所有内核对象的使用计数都将递减,所有的用户对象和GDI对象都会被销毁。 一旦进程终止(不管是如何终止的),系统会保证不留它的任何部分。绝对没有任何办法知道那个进程是否运行过。进程在终止后绝对不会泄露任何东西。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ (2)Linux中,你所说的内存,epoll fd,socket fd等都会回收,但并不是所有在自己的应用程序中申请的资源都会回收。我曾经碰到过一个SystemV信号量,如果创建了信号量集合,但是程序退出前并不进行remove操作,即使程序 正常 退出了,系统的SystemV信号量仍然被占用。 (3)关于程序(包括多进程程序),最好还是自己做好资源的申请和释放。尤其关于您提到的这些资源,在程序中实现释放也并不会带来太多的劳力吧。 以上个人思路,继续讨论。
静之深 2014-06-25
  • 打赏
  • 举报
回复
引用 3 楼 xosion 的回复:
我要是留一堆那种调用内核的句柄,比如epoll, socket, 动态库指针, 文件锁之类的不关闭, 不会对系统产生影响吧?
进程内的资源当进程销毁时都会被操作系统回收的,不会对系统有影响,不过能自己关闭就自己关闭(关闭时机不一样可能会导致结果不一致,假如是在多线程中)
JamesWatson 2014-06-25
  • 打赏
  • 举报
回复
我要是留一堆那种调用内核的句柄,比如epoll, socket, 动态库指针, 文件锁之类的不关闭, 不会对系统产生影响吧?

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧