return() 与exit() 的区别

在初学编程的过程中,往往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但是还是存在问题,大家可以继续研究研究。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值