abort()与exit()的区别?

        分类:             MFC              2011-01-04 14:13     2233人阅读     评论(0)     收藏     举报    

abort()使程序异常退出,exit()可以有传入值。
--------------------------------------------------------------- abort writes a termination message on stderr ("Abnormal program termination"), then aborts the program by a call to _exit with exit code 3.
exit terminates the calling process. Before termination, exit does the following: closes all files writes buffered output (waiting to be output) calls any registered "exit functions" (posted with atexit) --------------------------------------------------------------- exit()可以指定退出的状态,正常或者出错。 abort()好像只是退出程序而已。 --------------------------------------------------------------- exit()退出前先要执行vatexit()设置的函数 abort()使程序非正常退出 ---------------------------------------------------------------
abort()仅仅使程序退出,啥也不做. exit()在退出前要做一些清理工作. --------------------------------------------------------------- 在华中科技大学《C++程序设计实践教程》中,谈到这一区别: 按面向对象的思想,程序也是一个对象,因此,程序也有生有死。 C++在编译一个程序后,这样执行程序:(1)执行开工函数,此时对 程序初始化,主要指全局变量初始化。(2)调用main函数。(3)执行 收工函数,对全局变量(对象)进行析构。所以如下程序会有输出, 尽管main函数为空: #include <stdio.h> int  x=printf("ABCDEF"); void main( ){ } 现在,来谈abort和exit以及return的区别。return返回,可析构 main或函数中的局部变量,尤其要注意局部对象,如不析构可能造成 内存泄露。exit返回不析构main或函数中的局部变量,但执行收工函数, 故可析构全局变量(对象)。abort不析构main或函数中的局部变量,也不 执行收工函数,故全局和局部对象都不析构。 所以,用return更能避免内存泄露,在C++中用abort和exit都不是好 习惯。 请给分。 ---------------------------------------------------------------
exit() Terminate the calling process after cleanup (exit) or immediately (_exit). abort() Aborts the current process and returns an error code

____________________________________________________________

#include <stdlib.h>

exit和_exit函数用于正常终止一个程序: _exit立即进入内核,exit则先执行一些清除处理(包括调用执行各终止处理程序,关闭所有标准I / O流等),然后进入内核。使用不同头文件的原因是:exit是由ANSI C说明的,而_exit则是由POSIX.1说明的。        由于历史原因,exit函数总是执行一个标准I/O库的清除关闭操作:对于所有打开流调用 fclose 函数。exit和_exit都带一个整型参数,称之为终止状态(exit status)。大多数UNIX shell都提供检查一个进程终止状态的方法。如果( a )若调用这些函数时不带终止状态,或( b ) main执行了一个无返回值的re turn语句,或( c ) main执行隐式返回,则该进程的终止状态是末定义的。这就意味着,下列经典性的C语言程序:              #include <stdio.h>              main ()              {                       printf ("hello, world /n");              }        是不完整的,因为main函数没有使用return语句返回(隐式返回),它在返回到C的起动例程时并没有返回一个值(终止状态)。另外,若使用:                return( 0 ) ;或者                exit( 0 );         则向执行此程序的进程(常常是一个shell进程)返回终止状态0。另外,main函数的说明实际上应当是:                                              int main(void)        将main说明为返回一个整型以及用exit代替return,对某些C编译程序和UNIX lint(1)程序而言会产生不必要的警告信息,因为这些编译程序并不了解main中的exit与return语句的作用相同。警告信息可能是“ control reaches end of nonvoid function(控制到达非void函数的结束处)”。避开这种警告信息的一种方法是:在main中使用return语句而不是exit。但是这样做的结果是不能用UNIX的grep公用程序来找出程序中所有的exit调用。另外一个解决方法是将main说明为返回void而不是int,然后仍旧调用exit。这也避开了编译程序的警告,但从程序设计角度看却并不正确。本章将main表示为返回一个整型,因为这是ANSIC和POSIX.1所定义的。我们将不理会编译程序不必要的警告

其实很多人所谓的正常退出,基本上指以下两种: 1. 退出前必须完成指定的工作,如向某个远端的端口发消息 2. 退出时要关照到那些打开的流,如要正常将缓冲区的数据输出到文件
这样考虑的话,异常退出就是上面罗列两点反过来...
我们再来关注程序的几种退出方式: 1. 自然死亡:main函数的return 0 2. 勇敢自杀:调用 exit 或者 abort 3. 死于非命:被杀手CTRL+C/kill,不小心踩到地雷(触发某些硬件错误),中了流弹(未捕获的信号、异常)
硬件错误、无法捕获的异常这两种情况无法把控,所以这里不详述。其他程序退出方式中,可以被归类为异常退出的,也就不外乎这两类: 1. Ctrl+C kill之类,且未完成正常退出时该完成的工作 2. abort exit之类,且未完成正常退出时该完成的工作
换句话说,如果被终止时,已经没有需要做的工作,即使是被kill,也可视作正常退出。这里,让我们关注于符合“异常退出”条件的情况。上面列出的两种异常退出的主要区别: 1. 第一类是不会去清理打开的文件描述符的 2. 第二类会清理文件描述符,缓冲区;abort 和 exit 的不同在于是否析构静态和全局对象,exit还可调用atexit注册回调函数,不过如果对SIGABRT信号注册handler,那abort和exit就没什么区别了。
最后,给出简单的结论,不继续展开了。通过下面的方法可正常退出: 1. 通过abort或者exit配合回调函数,在退出之前完成需要做的清理工作
2. 捕获常见的"杀手",再执行 1。常见需要捕获的有:SIGINT SIGTERM
------- 信号参考资料:http://www.ibm.com/developerworks/cn/linux/l-ipc/part2/index1.html
abort是会产生core文件的 terminate abort exit 的区别...

    • abort indicates "abnormal" end to the program,  and raises the the POSIX signal SIGABRT, which means that any handler  that you have registered for that signal will be invoked, although the  program will still terminate afterwords in either case. Usually you  would use abort in a C program to exit from an unexpected  error case where the error is likely to be a bug in the program, rather  than something like bad input or a network failure. For example, you  might abort if a data structure was found to have a NULL pointer in it when that should logically never happen.

    • exit indicates a "normal" end to the program, although this may still indicate a failure (but not a bug). In other words, you might exit with an error code if the user gave input that could not be parsed, or a file could not be read. An exit code of 0 indicates success. exit also optionally calls handlers before it ends the program. These are registered with the atexit and on_exit functions.

    • std::terminate is what is automatically called  in a C++ program when there is an unhandled exception. This is  essentially the C++ equivalent to abort, assuming that you  are reporting all your exceptional errors by means of throwing  exceptions. This calls a handler that is set by the std::set_terminate function, which by default simply calls abort.

aborb()程序结束形式的更多相关文章

  1. #写一个登陆的程序 ( 1.最多登录失败3次 2.登陆成功,提示欢迎XX登录,今天的日期是XXX,程序结束 3.要检验输入是否为空,账户和密码不能为空 4.账户不区分大小写)

    import datetime import MySQLdb today=datetime.datetime.today() username=str(input('请输入账户:')) passwd1 ...

  2. Matlab 程序结束后发送短信或者邮件

    近期,在服务器上运行matlab程序,由于数据比较多,程序比较复杂,运行时间不固定,而且需要经常改变参数,重复运行几次,所以不清楚程序何时结束,以便于修改参数,继续运行.开始有时间就看看程序是否运行结 ...

  3. VB6 让程序结束后带有返回值

    第三方命令行程序运行完之后,批处理中可以随时通过errorlevel变量收取运行结果.而VB写的控制台程序却没有提供这样的功能.关于让控制台程序返回值的教程是本博客独家放出. 返回值,其实也就是进程的 ...

  4. Ubuntu-Tensorflow 程序结束掉GPU显存没有释放的问题

    笔者在ubuntu上跑Tensorflow的程序的时候,中途使用了Win+C键结束了程序的进行,但是GPU的显存却显示没有释放,一直处于被占用状态. 使用命令 nvidia-smi 显示如下 两个GP ...

  5. centos系统java后台运行(xshll关掉不至于jar程序结束)

    这样执行,就可以后台运行java程序 nohup java -Dfile.encoding=UTF-8 -jar xxx.jar  & 后台内容在该目录下nohup .out文件内,netst ...

  6. 微信小程序-表格形式如何布局?

    微信小程序没有现成的table标签,该怎么布局呢? <view class="my-grids"> <block wx:for="{{grids}}&q ...

  7. boost::asio::socket tcp 连接 在程序结束时崩溃。

    刚开始的时候一直不知道怎么回事,不过幸好我有在每个class 的析构时都打印一条信息. 这个时候发现我的一个tcp_connection (就是自定义的一个连接类) 在最后才被析构. 所以感觉这里可能 ...

  8. C\C++程序结束另外的进程

    WinExec("taskkill /f /im center_flextrbo.exe",SW_HIDE);

  9. Winform运行外部控制台程序,并在程序结束后执行其他动作

    ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = @"程序名"; psi.Arguments = @&qu ...

随机推荐

  1. cscope使用

    [[]][]再加上][一共是 4 个在段落(对于 C 来讲就是函数)间跳转的命令. 总结是:1,相同就跳到函数的开头:(如果都是左括号或者都是右括号),不同就跳到函数的结尾:     { 和 } 用来 ...

  2. poj1980

    首先想到费用流,但m<=100000还是算了吧那就感觉要用dp了,首先将a,b排序贪心一下可知,a,b的配对肯定不可能出现交叉这样就可以dp了,复杂度O(nm)还是过不去在贪心一下会发现,对于a ...

  3. Oracle存储过程 --3

    Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常. Oracle存储过程可以有无参数存储过程和带参数存储过程. 一.无参程序过程语法 1 create or replace pro ...

  4. 线性代数(高斯消元):JSOI2008 球形空间产生器sphere

    JSOI2008 球形空间产生器sphere [题目描述] 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确 ...

  5. jdk环境变量配置方法

    jdk环境变量配置方法: 在安装完jdk后,还需要对jdk的环境变量进行配置才能正常使用,下面教大家如何配置jdk环境变量: 1.右键选择 计算机→属性→高级系统设置→高级→环境变量 2.系统变量→新 ...

  6. VS2010如何生成release文件

    点击生成-->配置管理器-->活动解决方案配置下拉菜单中选择release就行了,最后再编译一下就在相应的目录下生成了

  7. POJ 3050 穷举

    题意:给定一个5*5的地图,每个格子上有一个数字.从一个格子出发(上下左右4个方向),走5步将数字连起来可以构造出一个6位数.问该地图可以构造出多少个不同的6位数. 分析:可以对每个格子做深度优先遍历 ...

  8. hdoj 1711 Number Sequence【求字串在母串中第一次出现的位置】

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. 第1章 Python基础之字符编码

    阅读目录 一.什么是字符编码 二.字符编码分类 三.字符编码转换关系 3.1 程序运行原理 3.2 终极揭秘 3.3 补充 总结 回到顶部 一.什么是字符编码 计算机要想工作必须通电,也就是说'电'驱 ...

  10. 【C语言天天练(二一)】内联函数

            引言:调用函数时,一般会由于建立调用.传递參数.跳转到函数代码并返回等花费掉一些时间,C语言的解决的方法是使用类函数宏.在C99中,还提出了第二种方法:内联函数.         内联 ...