return, exit, _exit的区别

return是返回的最常用的方式

_exit属于POSIX定义的系统调用

exit是GLIBC封装之后的函数

1 _exit和exit都会导致整个进程退出,清理进程所占用的资源,但是glibc封装exit函数的时候加了一些功能:比如提供了在结束程序时回调的接口(atexit), flush 缓冲区(系统调用是没法做这个的

,因为像printf, scanf之类的缓冲区都属于应用层缓冲区,内核清理资源自然无法顾及)

2return 会清理函数栈,另外两个就不会了,如果是最后一个线程return,也会像exit那样清理资源并flush缓冲区,这一点可以通过一段代码观察一下:

  

 1 #include<iostream>
 2 #include<unistd.h>
 3 using namespace std;
 4
 5 class A
 6 {
 7 public:
 8     A(){
 9         cout << "constructor" << endl;
10     }
11     ~A(){
12         cout << "distructor" << endl;
13     }
14 };
15 void func(int i)
16 {
17     A a;
18     if(i == 0)
19         _exit(-1);
20     else
21         return;
22 }
23
24 int main()
25 {
26     func(1);
27     return 0;
28 }

这里可以发现,只有按照return 方式返回局部变量a的析构函数才能得到调用,因为exit _exit都是不清理函数栈的.

一般这不会有什么问题,因为资源都回收了,栈空间自然也没了.但是对于约定在函数返回时调用的函数就没法调用了.

时间: 2024-10-12 20:28:08

return, exit, _exit的区别的相关文章

return exit _exit

(1)进程终止: C程序的终止分为两种:正常终止和异常终止. 正常终止分为: return, exit, _exit, _Exit, pthreade_exit. 异常中指分为: abort, SIGNAL,线程响应取消. (2)atexit终止处理程序: ISO C规定,一个进程最多可登记32个终止处理函数,这些函数由exit按登记相反的顺序自动调用.如果同一函数登记多次,也会被调用多次. (3)exit 与 _exit主要区别: main函数结束时也会隐式地调用exit函数,exit函数运行

PHP中return,exit,die的区别

参考:die(),exit(),return的区别 1.die() 是遇到错误才停止,停止程序运行,输出内容(是程序级别的) 2.exit,exit():是一个函数 是停止程序运行,前者不输出内容:后者输出内容(是程序级别的) exit(0):正常运行程序并退出程序:     exit(1):非正常运行导致退出程序: 3.return:只是一个关键字        return就是纯粹的返回值了,但是也不会运行后续代码(是函数级别的) 补充:  1. return是语言级别的,它表示了调用堆栈的

Linux中exit与_exit的区别

在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXIT_SUCCESS);可读性比较好一点. 作为系统调用而言,_exit和exit是一对孪生兄弟,它们究竟相似到什么程度,我们可以从Linux的源码中

android finish和system.exit(0)的区别

finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理:当调用System.exit(0)时,杀死了整个进程, 这时候活动所占的资源也会被释放. 在开发android应用时,常常通过按返回键(即keyCode == KeyEvent.KEYCODE_BACK)就能关闭程序,其实大多情况下该应用还在任务里运行着,其实这不是我们想要的结果. 我们可以这样做,当用户点击自定义的退出按钮或返回键时(需要捕获动

java中,return和return null有什么区别吗?

java中,return和return null有什么区别吗? 最大的区别:return;方法的返回值必须是void!return null;方法的返回值必须不是 原始数据类型(封装类除过)和void! return 就是跳出方法...return null也是跳出方法并返回null.. 也就是说return null必须用在返回值不是void的方法里面..return可以用在任何方法里面 不要认为null就是没有值..null就是值..真正的没有值是..比如你String s;这个时候s是没有

Return 和 Break 的区别

前段日子发布的负面情绪太多了,哦哦,其实我需要的是努力,努力提高自己的真实能力.经历了好多的鄙视否定,我已经没有最初那么敏感,心态平和了许多.我没有借口说基础不好了,一年了,要努力的话,那么我应该不会落后太远,可我努力了吗?好像大部分回忆都是在加班加点的费劲的完成任务,而自己的编程知识确实无暇顾及.真的没时间吗?时间都是挤出来的.既然你选择了这个,那就做好它,不要让自己处于最低劣的状态.今天起,还是依旧努力加强编程能力,这是根本. 今天晚上看了郝斌的视频,记下心得: 1.  return 表达式

exit(0),exit(1),exit(-1)的区别?

exit(0),exit(1),exit(-1)的区别? 进程结束,返回给系统的返回值不同而已. 如果你的进程为 user, 则执行./usr后,执行echo $? 可以看到你的进程的返回值,就是你在程序里设置的值,如exit(0),返回0 exit(0) 表示程序正常, exit(1)/exit(-1)表示程序异常退出,至于是1还是-1个人习惯,但是正常情况下应该用 EXIT_SUCCESS表示正常,EXIT_FAILURE表示失败,定义在stdio.h里. 0 正常 1,-1异常 这是习惯这

Oracle 中的GOTO,RETURN,EXIT

1.GOTO,主要用于跳转,但会打乱我们的程序逻辑,一般不使用,它可以实现RETURN,EXIT的功能 2.RETURN,返回程序末尾,结束程序 3.EXIT,主要用于退出当前循环,相当于java中的break. 4.要实现java中continue的功能可以使用自定义异常的方式 它们之间的比较: --这里的GOTO相当于下面的EXIT用法 BEGIN FOR i IN 1..2 LOOP IF i=2 THEN GOTO label; END IF; dbms_output.put_line(

python中生成器对象和return 还有循环的区别

python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因为return后面就不能跟任何东西,意味着函数的结束.那么我们完全可以这么做: def main(): for i in range(1,100): yield i 这样就等于生成了一个循环返回对象,特别在爬虫scrapy中较为常见!yeild和return还有for 上本质有什么区别呢?其实很简单