在初学编程的过程中,往往return和exit我们不做过多的区分,都只认为是程序的结束,例如我们写的第一个程序

#include <iostream>
int main()
{using namespace std;cout << "Helloword!";cin.get();//exit(0);return 0;
}

无论使用exit()或是使用return都能结束程序的那么区别在哪里?
区别在于return会调用所有静态变量的析构函数,完成退栈;
而exit()不会。

那么这好像没什么所谓吧,程序都结束了好像没什么所谓吧。退就退了,留着搞什么啊,那么我们先来回忆一下两个常用的东西fork和vfork。

复习下进程吧
进程由4个要素组成:
①进程控制块:进程标志
②进程程序块:可与其他进程共享
③进程数据块:进程的私有空间,用于存放私有的数据及堆栈空间
④独立的空间:进程必须有的条件

fork()创建子进程,复制了父进程的资源,包括内存内容、task_struct内容,新旧进程使用同一段代码,复制数据段和堆栈段,一但子进程开始运行,则新的进程的地址已经分开,两者运行独立.

vfork()创建的子进程完全运行在父进程的地址空间上
子进程对虚拟地址空间任何数据的修改父进程可见!!!
子进程对虚拟地址空间任何数据的修改父进程可见!!!
子进程对虚拟地址空间任何数据的修改父进程可见!!!
父进程会被子进程阻塞,子进程结束。

先来看一段代码吧

 #include <iostream>
#include <stdlib.h>
#include <unistd.h>
int glob = 6;
int main()
{using namespace std;int var;  pid_t pid;  var = 88;cout<<"before vforkn"<<endl;if ((pid = vfork()) < 0){cout<<"vfork error"<<endl;exit(-1);}else if (pid == 0){/* 子进程 */glob++;var++;return 0;//exit(0);    }cout << getpid() << "  " << glob << "  " << var << "  " << endl;return 0;//exit(0);
}

这里稍微解释一下fork和vfork是两个很有趣的函数,他反发返回值会有3种情况:
①在父进程中,fork(vfork)返回新创建的子进程的进程ID;
②在子进程中,fork(vfork)返回0,可以用来判断是不是子进程;
③如果出错,fork(vfork)返回一个负值。

好了说这里,我们可以猜测一下输出应该是什么
应该是
进程识别码 7 89
那么实际的输出结果是什么呐?

这是什么鬼,为什么最后那个数不是89呐?
我们先把它改成exit(0)试试看

正常了,这是为什么呐?
回到我们一开始说的return和exit的区别上
return 会退栈,会释放静态变量,由于vfork使用的是父进程的空间,当子进程return的时候
int var;
var = 88;
作为动态存储的数据,存储在栈上,由于退栈,会被释放;
当子进程结束后
父进程该打印var的值的时候会怎么办,var已经被儿子释放了,这不是坑爹吗?
glob=7不受影响是因为它作为静态存储的变量,不会受到退栈的影响。
将var改为static int;后结果var的值会变回89但是还是存在问题,大家可以继续研究研究。

return() 与exit() 的区别相关推荐

  1. 【VS开发】Return与Exit的区别

    1. exit用于结束正在运行的整个程序,它将参数返回给OS,把控制权交给操作系统:而return 是退出当前函数,返回函数值,把控制权交给调用函数. 2. exit是系统调用级别,它表示一个进程的结 ...

  2. return 与 exit()的区别--return退出本函数,exit()退出整个程序

    retrun与exit()均可用于函数的返回,但return只是本函数的返回,而exit()则是整个程序的退出. #include <stdlib.h>int sum(int a, int ...

  3. C语言中return和exit的区别

    1,exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的.main函数结束时也会隐式地调用exit函数.exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自 ...

  4. Linux中进程正常退出return和exit()的区别

    exit是一个函数,有参数.void exit(int status) .exit执行完后把控制权交给系统. return是函数执行完后的返回.return执行完后把控制权交给调用函数. return ...

  5. C语言再学习 -- 关键字return和exit ()函数

    终于到了最后一个关键字 return 了.感觉时间过的飞快,转眼间又是一年,如果时间可以 return 就好了. 一.return 介绍 参看:C语言中return 用法 1.含义: return 表 ...

  6. 多线程编程:return、pthread_exit()、exit()函数区别

    多线程编程:return.pthread_exit().exit()函数区别: return:                 返回到调用者那里去 pthread_exit():    将调用该函数的 ...

  7. oracle 存储过程循环体中的return和exit区别:

    oracle 存储过程循环体中的return和exit区别: (1) return 跳出整个循环,终止该循环, 后面的不再执行.     相当于 Java 中的break; (2)  exit 跳出本 ...

  8. exit(0) exit(1) return() 3个的区别

    exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在主函数中,则会退出函数并返回一值. 详细说: 1. return返回函数值,是关键字 ...

  9. 中断语句break、continue、return、exit和goto的区别

    1.continue语句 continue语句是这5种结束循环的方式中最特殊的,因为它并没有真的退出循环,而是只结束本次循环体的执行,所以在使用continue的时候要注意这一点. 下图为各种循环结构 ...

  10. exit()和return的含义及区别

    exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在主函数中,则会退出函数并返回一值.1. return返回函数值,是关键字: exit ...

最新文章

  1. 物体可见性信息在3D检测中的探索CVPR2020(oral)
  2. 还在担心工作被AI取代?不如掌握这门硬实力,抢占职场发展机遇
  3. [3/21]Windows Server 2008时钟方面的改进展示
  4. 公共子序列(信息学奥赛一本通-T1297)
  5. 词根 sent/sens
  6. 六张图|教开发者该如何应对“中年危机”
  7. vsftpd中文目录乱码的解决办法
  8. 雪碧图PHP,Css Sprite(雪碧图、精灵图) - SegmentFault 思否
  9. Application 用法
  10. matlab反拉氏变换,matlab拉普拉斯变换.doc
  11. excel常用操作收集
  12. 快速使用ros小乌龟教程——ROS初体验
  13. 如何在HTML页面中引入一首网易云音乐以及B站的视频
  14. Android面试:ActivityA与ActivityB相互跳转对应生命周期变化
  15. CSDN博客索引-2
  16. [UE4渲染]LightPass中加入ramp图
  17. 非因推荐 | 肿瘤微环境研究大剖析——肿瘤相关巨噬细胞
  18. Javascript中四舍六入五成双
  19. 磁力链接搜索网站研究心得!
  20. PL/SQL中的dual表含义和用法

热门文章

  1. JavaWeb 页面跳转方式连接数据库
  2. 【苦练基本功】代码整洁之道 pt4(第10章-第12章)
  3. Golang DNS 随便写写
  4. 正式对标苹果,小米 12 系列三箭齐发,MIUI 欲成为跨设备操作系统
  5. 建立“知识共享”生态圈,培养塔尔斯基数学小后代,不是说假话、放空炮
  6. Niagara_Advanced内容示例 1.3 Communicate with External Render Targets
  7. RT-Thread:GD32E103 移植USB HOST
  8. 教你怎么煲耳机 让声音更美妙!
  9. uni-app watch computed API作用语法用法 +案例
  10. NVIDIA显卡驱动及CUDA相关安装流程(包括多版本cuda切换)