return()、exit()、_exit()、aboart()函数区别

来源:互联网 发布:linux 复制重命名 编辑:程序博客网 时间:2024/05/19 00:18

1.exit()

exit()和_exit()函数都可以用于结束进程,不过_exit()调用之后会立即进入内核,

而exit()函数会先执行一些清理之后才会进入内核,

在调用时,会做大部分清理工作,但是决不会销毁局部对象,因为没有stack unwinding。

会进行的清理工作包括:销毁所有static和global对象,清空所有缓冲区,关闭所有I/O通道。

终止前会调用经由atexit()登录的函数,atexit如果抛出异常,则调用terminate()。

2._exit()

_exit()函数终止调用的进程,进程所有的文件描述符(在linux中一切皆文件)都被关闭, 

这个进程的所有子进程将被init(最初的进程,所有的进程都是来自init进程,所有的进程都由其父进程创建,即init进程是所有进程的祖先!)进程领养,

并且这个终止的进程将向它的父进程发送一个sigchld信号。

_exit()的参数status被返回给这个终止进程的父进程来作为这个终止进程的退出状态,这个退出状态值能被wait()函数族的调用收集

(就是通过wait()函数来获得子进程的退出状态,之后wait()函数将会释放子进程的地址空间,否则会出现zoom进程)

3.aboart()

abort()函数用于异常退出。不进行任何清理,直接退出。返回一个错误代码。错误代码的缺省值是3。

abort()函数导致程序非正常退出除非sigabrt信号被捕捉到,并且信号处理函数没有返回(即abort()函数给自己发送sigabrt信号),

如果abort()函数导致程序终止,所有的打开的流将被关闭并且刷新。

4.return()

return 不是系统调用,也不是库函数,而是一个关键字,表示调用堆栈的返回(过程活动记录),是函数的退出,而不是进程的退出。

  return函数退出,将函数的信息返回给调用函数使用,与exit()和_exit()函数有本质区别。

总的来说:

如果在main中,则之后再交由系统调用exit()。

return返回,可析构 main或函数中的局部变量,尤其要注意局部对象,如不析构可能造成 内存泄露。

exit返回不析构main或函数中的局部变量,但执行收工函数, 故可析构全局变量(对象)。

abort不析构main或函数中的局部变量,也不 执行收工函数,故全局和局部对象都不析构。 
    所以,用return更能避免内存泄露,在C++中用abort和exit都不是好 习惯

对于exit函数,可以利用atexit函数为exit事件"挂接"另外的函数,这种"挂接"有点类似Windows编程中的"钩子"(Hook)。

程序输出 "atexit挂接的函数"后即终止,即便是不调用exit函数,当程序本身退出时,

atexit挂接的函数仍然会被执行。atexit可以被多次执行,并挂接多个函数,

这些函数的执行顺序为后挂接的先执行。在Visual C++中,如果以abort函数(此函数不带参数,

原型为void abort(void))终止程序,则会在debug模式运行时弹出错误提示的对话框。

Linux中abort()会产生core   dump。

原创粉丝点击