最近重新看了一下APUE, chapter 7中讲到进程终止有以下几种方式:1) 从main返回2) 调用exit3) 调用_exit或_Exit4) 最后一个线程返回5) 最后一个线程pthread_exit其中,对于2,3的区别书上说的是"_exit很快进入内核模式,而exit则执行处理操作",为了更好的理解这句话,我编写了下面的测试例子.(见后面的代码示例)测试环境:ubuntu 11.10gcc 4.7.1对于main的最后一行分别采用最近重新看了一下APUE, chapter 7中讲到进程终止有以下几种方式:1) 从main返回2) 调用exit3) 调用_exit或_Exit4) 最后一个线程返回5) 最后一个线程pthread_exit其中,对于2,3的区别书上说的是"_exit很快进入内核模式,而exit则执行处理操作",于是我编写了下面的测试例子.对于main的最后一行分别采用
1) return 02) exit (0)3) _exit (0)4) _Exit (0)几种方式,结论如下** return 0 与 exit (0)等价,在main返回后,分别会执行下面的动作序列:main ends here //先从main返回local //释放栈上的局部变量my exit 2 called //以出栈的方式调用axexit注册的函数my exit 1 calledglobal //释放全局数据** 而_exit (0) 与 _Exit(0)是等价的,见libC 25.6.5 Termination Internals.只产生下面的动作序列:
main ends here**** 结论:可见 _exit(0) 与 _Exit(0)的返回速度的确比 exit (0) 和 return (0)要快,换言之,_exit (0) 与 _Exit (0) 的确没有做数据的收尾工作就匆匆返回了.在实际使用中,如果可能不用_exit (0)和_Exit (0)的话,还是少用把下面是有关_exit的说明:
DESCRIPTION
The function _exit() terminates the calling process "immediately". Any open file descriptors belonging to the process are closed; any children of the process are inherited by process 1, init, and the process's parent is sent a SIGCHLD signal.The value status is returned to the parent process as the process's exit status, and can be collected using one of the wait(2) family of calls.
The function _Exit() is equivalent to _exit().
#include <stdio.h>#include <stdlib.h>#include <iostream>using namespace std;#include <string>using std::string;#include <unistd.h>void myexit1(){fprintf(stderr,"my exit 1 called\n");}void myexit2(){fprintf(stderr,"my exit 2 called\n");}class MyClass{public:
MyClass(string name){
mName = name;}
~MyClass()
{
cout <<mName << endl;}
string mName ;};MyClass bb("global");int main(){MyClass bb("local");atexit (myexit1);atexit (myexit2);fprintf(stderr,"main ends here\n");_Exit (0);}