exit, _exit, _Exit,abort,atexit-->一直未注意atexit

转:

http://blog.sina.com.cn/s/blog_5cec5bad0100b0x2.html

http://blog.csdn.net/iefswang/article/details/7430775

http://blog.sina.com.cn/s/blog_605f5b4f0100x3v0.html

http://baike.baidu.com/view/653930.htm

exit, _exit, _Exit 都是进程终止函数。

abort: 产生 SIGABRT 信号。非正常退出,即在程序碰到灾难性错误时强制退出。由于是非正常退出,因此不会做其它任何操作。

atexit: 是在执行 exit 函数时设置要作的工作,实际就是调用要在进程退出想让程序执行的函数。

 

其参数是要调用的函数地址。参数函数是一个无参数无返回值的函数。atexit可以登记32个函数,这些函数由 exit 函数自动调用,登记的顺序和调用的顺序相反,即最后登记的先执行。同一函数登记多次也会调用多次。


exit :是一个C库标准函数。此函数执行会首先调用由 atexit注册的函数,然后执行关闭所有标准IO流,刷新流缓冲区等操作。对于常用的有返回值的 return 调用,相当于调用了 exit 。如 return(0)== exit(0);


_exit 是一个系统调用。此函数不会调用 atexit 注册的函数,也不会运行信号处理程序。对标准IO流的缓冲区是否进行刷新取决于该函数在系统中的实现。一般UNIX下不会刷新。 exit函数会调用此函数。(在windows下的_exit函数会对标准IO流的缓冲进行刷新)


_Exit 是一个C库标准函数。其动作类似 _exit 


exit_exit函数
exit_exit函数用于正常终止一个程序: _exit立即进入内核,exit则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准O流等),然后进入内核

#include <stdlib.h>
void exit(int status);
#include <unistd.h>
void _exit (int status) ;
使用不同头文件的原因是:exit是由ANSI C说明的,而_exit则是由POSIX.1说明的

由于历史原因, exit函数总是执行一个标准I/O库的清除关闭操作:对于所有打开流调用fclose函数。 

注意,内核使程序执行的唯一方法是调用一个exec函数。进程自愿终止的唯一方法是显式或隐式地(调用)调用t。进程也可非自愿地由一个信号使其终止exit本身不是系统调用,而是一个C标准库的函数而已,在stdlib里面,系统调用是_exit内部实现去完成的


return与exit的区别

在进程操作中exit是结束当前进程或程序并把控制权返回给调用该程序或者进程的进程即父进程并告诉父进程该当前进程的运行状态,而return是从当前函数返回,如果是在main函数中,main函数结束时隐式地调用exit函数,自然也就结束了当前进程。


return是语言级别的,它表示了调用堆栈的返回;而exit是系统调用级别的,它表示了一个进程的结束exit函数是退出应用程序,并将应用程序的一个状态返回给OS,这个状态标识了应用程序的一些运行信息。

 

main函数里面return(0)exit(0)是一样的,子函数用return返回;而子进程用exit退出,调用exit时要调用一段终止处理程序,然后关闭所有I/O流。


atexit

功 能: 注册终止函数(即main执行结束后调用的函数)

exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非0表示程序非正常结束。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件。 


下面是一段代码示例:
#include <stdlib.h> // 使用atexit()函数所必须包含的头文件stdlib.h
#include <iostream.h>

void terminateTest()
{
    cout<<"程序正在结束..."<<endl;
}

int main(void)
{
    // 注册退出处理函数
    atexit(terminateTest);

    cout<<"the end of main()"<<endl;

    return 0;
}

程序的运行结果为:
the end of main()
程序正在结束...

 

 

这些函数都是在main结束以后才被调用的。atexit只是注册他们,使得他们在main结束以后被调用,看名字就可以看出来。
atexit这个玩意超有用,可以按照你予设的顺序摧毁全局变量(类),例如有个log类,你在其它的全局类里也有可能调用到Log类写日志。所以log类必须最后被析构 。假如没有规定析构顺序,那么程序在退出时将有可能首先析构log类,那么其它的全局类在此时将无法正确写日志


把数据写回文件, 删除临时文件, 这才是真正有用的.



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值