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. AlgorithmsI PA2: Randomized Queues and Deques Deque

    本次作业考察利用array 或者linked list 实现规定时间复杂度的queue 和stack, 不能使用java 自带的stack 和queue. 目的是让我们掌握自己设计的函数的复杂度. D ...

  2. Codeforces Round #316 (Div. 2)

    A. Elections time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  3. -_-#【jQuery插件】Colorpicker 颜色选择器

    Spectrum - The No Hassle jQuery Colorpicker (jQuery 插件) Color Picker jQuery plugins (jQuery 插件) colo ...

  4. Light OJ 1021 - Painful Bases(状态压缩DP)

    题目大意: 给你一个base 进制的数字,把这个数字的每一位进行全排列,问有多少个数字是可以整除k的. 题目解析: #include<cstdio> #include<cstring ...

  5. Mac下Shell快捷键

    ctrl+a //移到行首 ctrl+e //移到行尾 ctrl+y // 插入最近删除的单词或语句 ctrl+k //删除光标处到行尾部分 ctrl+u //删除光标处到行首部分 ctrl+w // ...

  6. vijosP1194 Domino

    vijosP1194 Domino 链接:https://vijos.org/p/1194 [思路] 矩阵相乘. 参考Matrix67的文章: [代码] #include<cstdio> ...

  7. poj 3281 最大流建图

    题目链接:http://poj.org/problem?id=3281 #include <cstdio> #include <cmath> #include <algo ...

  8. PHP学习之[第07讲]PHP5.4 文件操作函数 之 图片计数器的实例

    1.filetype():输出文件类型: 2.stat():获取文件的基本属性的数组: 3.clearstatcache().is_executable().isDir().idFile().scan ...

  9. 杯具,万达电商又换CEO

    万达电商CEO再离职.而这距他入职还差一个月才满一年. 昨晚.万达电商CEO董策告诉新浪科技6月3日已正式从万达电商离职.将去往澳洲照应家人.而谈到离职原因和万达电商时,董策以开会为由收了电话. 从2 ...

  10. Swift-Lesson2(下)