关闭

exit与atexit

标签: c语言
676人阅读 评论(0) 收藏 举报
分类:

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

一、exit()函数


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

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

二、atexit()函数


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

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

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

下面是一段代码示例:
#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
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

回收进程用户空间资源 exit()函数 _exit()函数 atexit()函数 on_exit()函数

摘要:本文主要讲述进程的终止方式,以及如何使用exit()函数来终止进程,回收进程用户空间资源;分析了exit()函数与_exit()函数,return关键字的差异.同时详细解读了如何使用atexit...
  • u010006102
  • u010006102
  • 2014-10-03 11:48
  • 1217

C++中的atexit函数和exit函数

一、exit()函数 函数声明:void exit(int state); exit()函数用于在程序运行的过程中随时结束程序,exit的参数state是返回给操作系统,返回0表示程序正常结束,非...
  • sinat_24520925
  • sinat_24520925
  • 2015-03-07 18:27
  • 562

c语言基础函数——exit()和atexit()

C语言中的基础函数,exit()和atexit()。
  • jiangwei0512
  • jiangwei0512
  • 2016-02-14 16:55
  • 568

浅析exit()和atexit()函数

当内核使用一个一个exec函数执行c程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序需将此例程指定为程序的起始地址。启动例程从内核获取命令行参数和环境变量,然后为调用mian函数做好...
  • wy1550365215
  • wy1550365215
  • 2017-04-17 22:07
  • 377

atexit函数详解

对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方。当内核使⽤⼀个exec函数执⾏C程序时,在调⽤main函数之前先调⽤⼀个特殊的启动例程...
  • leex_brave
  • leex_brave
  • 2016-07-03 10:05
  • 4693

exit和_exit,atexit的浅析

首先,我们得了解进程的终止方式: 有8种方式使进程终止,其中前5种为正常终止,它们是 1:从 main 返回 2:调用 exit 3:调用 _exit 或 _Exit 4:最后一个线程从其启...
  • github_35124642
  • github_35124642
  • 2016-06-17 22:01
  • 173

_exit( )、exit( )、atexit( )函数比较思考

_exit( )、exit( )、atexit( )函数比较思考
  • Lucien_zhou
  • Lucien_zhou
  • 2017-03-22 23:26
  • 122

C++中Exit()与atexit()函数的使用

来源:http://blog.sina.com.cn/s/blog_5cec5bad0100b0x2.html   一、exit()函数 函数声明:void exit(int state...
  • yangyihongyangjiying
  • yangyihongyangjiying
  • 2015-03-26 14:59
  • 270

Linux中exit()函数和atexit函数

main函数 当内核使用一个exec函数执行C程序时,在调用main函数之前先调用一个特殊的启动例程,可执行程序将此例程指定为起始地址。启动例程从内核获取命令行参数和环境变量,然后为调用main函数做...
  • qq_36534818
  • qq_36534818
  • 2017-04-23 14:03
  • 110

exit和_exit函数,atexit函数 abort函数

#include exit和_exit函数用于正常终止一个程序: _exit立即进入内核,exit则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I / O流等),然后进入内核。使用...
  • cybertan
  • cybertan
  • 2013-06-18 12:50
  • 635
    个人资料
    • 访问:175549次
    • 积分:2297
    • 等级:
    • 排名:第18848名
    • 原创:12篇
    • 转载:216篇
    • 译文:0篇
    • 评论:22条
    最新评论