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

  1. exit( ) 函数符合 ISO C标准,在头文件 #include <stdlib.h>中。exit(n) 用于在程序运行的过程中随时结束程序,exit(n)的参数n是返回给OS的。main函数结束时也会隐式地调用exit( )函数。exit( ) 或 return 0 在被调用时会调用终止处理程序 atexit( ) ,然后会调用用户空间的标准 I/O 清理程序(如 fclose)做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数 tmpfile( ) 创建的临时文件。
  1. exit( )是结束一个进程,它将删除进程使用的内存空间,同时把错误返回父进程;
  1. _exit( ) 函数符合 POSIX 标准,在头文件 #include <unistd.h>中,会在被调用处直接结束进程,释放进程使用的内存空间,并销毁在内存中的数据结构。
  1. 简单比较下 exit(0) 、_exit(0) 和 return 0 的异同:
在开始下面简单的例子时,我们需要了解下 printf( ) 函数采用的是“缓冲 I/O”的方式进行输出, 该函数在遇到 '\n' 换行符的时候会自动读出缓冲区中的记录。例如 printf("xiaoming"),一般情况该函数不是立马会将“xiaoming”字符串打印到标准输出上去的。

下面的程序仅仅是打印一个字符串,然后使用 exit(0) 退出 main 程序。



还是打印了“xiaoming”字符串的,exit(0) 函数会在被调用时清理 I/O 。



使用 _exit(0) 函数来结束 main 程序时的情况: 



_exit(0) 函数在结束 main 程序的时候,并没有打印“xiaoming”字符串。


  1. atexit( ) 函数在头文件 #include<stdlib.h>中
功能:注册终止函数(即main执行结束后调用的函数)
用法:int atexit(void (*func)(void));
函数返回值为整型int,函数参数为函数指针
注意点:
(1)按照ISO C的规定,一个进程可以登记多达32个函数。 mian函数结束时也会隐式调用exit( )函数。exit( )函数运行时首先会执行由atexit( )函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流、关闭所有打开的流并且关闭通过标准I/O函数tmpfile( )创建的临时文件。
(2)atexit( )函数参数必须是 “不接受任何参数的void函数”
(3)exit( )调用这些注册终止函数的顺序与它们登记时候的顺序(主函数中的使用atexit函数的顺序)相反
  1. 用个简单的程序看下 atexit( ) 函数的使用:
第一种:直接使用 atexit( ) 函数时的情况


 
从下面的截图中可以看出,atexit( ) 函数在两个字符串输出函数的中间,但我们要知道那里只是分别对 myexit1 函数和 myexit2 函数进行“终止处理程序注册”。那什么时候 atexit( ) 函数会被使用呢? 在上面的程序中是在 return 0 处被调用,然后再清理缓冲 I/O 。



为了更进一步的理解,对上面的程序修改一丢丢:



为什么会有这样的输出呢?首先 printf( ) 函数要输出“xiaoming”,紧接着要输出“xiaohong”,这两个字符串会被缓冲区记录,此时并没有打印到标准输出中,然后到 return 0,return 关键字的执行会调用“终止处理函数”,即开始调用 atexit 中注册的函数程序。接着输出“myexit2\n”字符串,该字符串中有“换行符”,会读出缓冲区中的记录,并换行。再接着是打印“myexit1\n”字符串,所以才会有下面的显示结果。


  1. C 程序如何起动和终止:


=========================
参考的相关链接:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值