`
hududumo
  • 浏览: 238714 次
文章分类
社区版块
存档分类
最新评论

exit与atexit

 
阅读更多

一、exit()函数


函数声明:void exit(int state);

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


函数声明:int atexit(void (*func)(void));<wbr><br><wbr><br><wbr> 很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit()结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就是用atexit()函数来<strong><span style="color:#993300">注册程序正常终止时要被调用的函数。</span></strong></wbr></wbr></wbr>

<wbr><wbr><wbr>atexit()函数的参数是一个函数指针,函数指针指向一个没有参数也没有返回值的函数。atexit()的函数原型是:int atexit (void (*)(void));</wbr></wbr></wbr>

<wbr><wbr><wbr><strong><span style="color:#993300">在一个程序中最多可以用atexit()注册32个处理函数,</span><span style="color:#993300">这些处理函数的调用顺序与其注册的顺序相反</span></strong>,也即最先注册的最后调用,最后注册的最先调用。</wbr></wbr></wbr>

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

void terminateTest()
{
<wbr><wbr><wbr>cout&lt;&lt;"程序正在结束..."&lt;&lt;endl;<br> }</wbr></wbr></wbr>

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

<wbr><wbr><wbr>cout&lt;&lt;"the end of main()"&lt;&lt;endl;</wbr></wbr></wbr>

<wbr><wbr><wbr>return 0;<br> }</wbr></wbr></wbr>

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

<wbr style="line-height:25px"></wbr>

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

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

分享到:
评论

相关推荐

    exit和atexit的区别详细解析

    以下是对exit与atexit的区别进行了详细的分析介绍,需要的朋友可以过来参考下

    浅析结束程序函数exit, _exit,atexit的区别

    在一个程序中最多可以用atexit()注册32个处理函数,这些处理函数的调用顺序与其注册的顺序相反,也即最先注册的最后调用,最后注册的最先调用

    atexit函数和exit函数的理解

    工作找完了,老板逼着写各种乱七八糟的本子,偷着写点自己的理解... 按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit函数来登记这些函数。

    Python中atexit模块的基本使用示例

    atexit模块很简单,只定义了一个register函数用于注册程序退出时的回调函数,我们可以在这个回调函数中做一些资源清理的操作。 注:如果程序是非正常crash,或者通过os._exit()退出,注册的回调函数将不会被调用。 ...

    深入理解python中的atexit模块

    atexit 模块介绍 python atexit 模块定义了一个 register 函数,用于在 python 解释器中注册一个退出函数,这个函数在解释器正常终止时自动执行,一般用来做一些资源清理的操作。 atexit 按注册的相反顺序执行这些...

    详解C语言中return与exit的区别

    详解C语言中return与exit的区别 1,exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的。main函数结束时也会隐式地调用exit函数。exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些...

    c语言中return与exit的区别浅析

    exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile&#40;&#41;创建的临时文件。exit是结束一个进程,它将删除...

    函数(进程,输出)

    atexit,execl,execv,exit,vfork,getpid,

    linux进程函数大全

    linux进程函数大全 atexit(设置程序正常结束前调用的函数) 相关函数 _exit,exit,on_exit表头文件 #include定义函数 int atexit (void (*function)(void));

    4. 进程的创建、执行与终止1

    1. 调用退出处理程序(由atexit()和on_exit()注册的函数) 2. 刷新stdio流缓冲区 3. 使用由status提供的值执行_exit()系统

    UNIX环境高级编程(第七章)

    7.3.1 exit和_exit函数 122 7.3.2 atexit函数 124 7.4 命令行参数 125 7.5 环境表 126 7.6 C程序的存储空间布局 126 7.7 共享库 127 7.8 存储器分配 128 7.9 环境变量 130 7.10 setjmp 和longjmp函数 132 7.10.1 ...

    Linux C聊天室程序

    The program when exit(), it do not delete the Shared Memory Segments,you maybe use atexit() but the program have some processes. When one process is exit(),others is continue. The service program's ...

    C语言函数及相关知识

    atexit(exit_fn2); return 0; } 函数名: atof 功 能: 把字符串转换成浮点数 用 法: double atof(const char *nptr); 程序例: #include #include int main(void) { float f; char *str = "12345.67"; ...

    简要对比C语言中三个用于退出进程的函数

    主要介绍了C语言中三个用于退出进程的函数的对比,分别为_exit()函数和on_exit()函数以及atexit()函数,需要的朋友可以参考下

    bytekit:Java字节码套件

    @AtEnter @AtExit @AtExceptionExit @AtFieldAccess @AtInvoke @AtInvokeException @AtLine @AtSyncEnter @AtSyncExit @AtThrow 这个/参数/返回/抛出场地当地人子调用入参/返回值/子调用异常电话号码 ✓ ✓ ✓ ...

    linux_c API函数大全

    atexit(设置程序正常结束前调用的函数) 101 11.2 101 execl(执行文件) 101 11.3 102 execlp(从PATH 环境变量中查找文件并执行) 102 11.4 102 execv(执行文件) 102 11.5 103 execve(执行文件) 103 11.6 104...

    UNIX环境高级编程部分

    第17章 与PostScript打印机通信 17.1 引言 17.2 PostScript通信机制 17.3 假脱机打印 17.4 源码 17.5 小结 习题 第18章 调制解调器拨号器 18.1 引言 18.2 历史 18.3 程序设计 18.4 数据文件 18.5 服务器设计 18.6 ...

    UNIX环境高级编程

    第17章 与PostScript打印机通信 17.1 引言 17.2 PostScript通信机制 17.3 假脱机打印 17.4 源码 17.5 小结 习题 第18章 调制解调器拨号器 18.1 引言 18.2 历史 18.3 程序设计 18.4 数据文件 18.5 服务器设计 18.6 ...

Global site tag (gtag.js) - Google Analytics