在UNIX中使用_exit时,未清除的资源会发生什么变化?

时间:2011-08-31 20:05:38

标签: c++ c unix

我已经读过,当您希望在UNIX中终止进程时,可以调用exit_exit,并且该退出还会释放资源(从main返回时使用的样式) _exit会在没有清理的情况下立即终止。

使用_exit关闭程序对操作环境有什么影响,为什么要使用它?

3 个答案:

答案 0 :(得分:4)

除非您安装了_exit处理程序,否则退出exitatexit时释放的资源没有区别。命名共享内存对象,SysV IPC资源,文件系统中的文件等不会在任何类型的退出中被销毁;分配给进程的内存(实际上,它的整个虚拟内存空间),文件描述符等都会被破坏。有关详细信息,请阅读POSIX中的文档:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html

http://pubs.opengroup.org/onlinepubs/9699919799/functions/exit.html

通常唯一重要的区别是,如果使用_exit,则可能无法刷新stdio FILE对象(某些写入可能会丢失)。

答案 1 :(得分:2)

从手册页:

exit

  

exit()函数首先调用注册的所有函数        atexit(3C),按照其注册的相反顺序,        除了之前任何一个函数被调用之外        已经被调用的注册函数        它被注册的时间。

_exit

  

_Exit()和_exit()函数在功能上        当量。他们不会调用注册的函数        atexit(),不要调用任何已注册的信号处理程序,并且这样做        没有冲洗开放的溪流。

换句话说,exit_exit仍然执行资源(例如文件句柄和分配的堆内存)回收,如果操作系统这样做,但用户定义的东西,如静态析构函数将不会调用,文件不会在_exit情况下刷新。

答案 2 :(得分:2)

您的程序会自动配备一些默认的atexit()处理程序。致电exit()

  • 将刷新并关闭仍处于打开状态的文件和管道的流。
  • 全局数据将被破坏。

致电_exit()

  • 不会刷新仍处于打开状态的文件和管道的流。您很可能会丢失输出文件中的数据。
  • 不会破坏全局数据。

在这两种情况下,

  • 您已分配的所有内存都已恢复。
  • 您没有获得的已退出子进程仍将在进程表中(但是,僵尸似乎不是他们很久以前的大问题。)
  • 仍在运行的子进程成为孤儿并在init进程中被采用。