returnx与exit(x)到底有什么区别

return x与exit(x)到底有什么区别

创新互联建站是少有的网站制作、网站建设、营销型企业网站、成都微信小程序、手机APP,开发、制作、设计、卖链接、推广优化一站式服务网络公司,从2013年成立,坚持透明化,价格低,无套路经营理念。让网页惊喜每一位访客多年来深受用户好评


书中说main函数return相当于

exit(main(argc,argv))

但实践中出了点问题

return x与exit(x)到底有什么区别

运行结果:

return x与exit(x)到底有什么区别

如果把exit换成return确不会。

基础知识

首先说说fork与vfork的区别

●fork 创建一个进程,并把父进程内存数据copy拷贝到子进程去。

●vfork 创建一个进程,并和父进程的内存数据share一起用。

两个区别是:一个share,一个是copy。

man fork 一下,发现vfork是这样工作的:

(1)保证子进程先执行

(2)当子进程调用exit()或exec()后,父进程往下执行。

那么,为什么那么,要存在vfork?(存在即合理) 原因是这样的—— 起初只有fork,但是很多程序在fork一个子进程后就exec一个外部程序,于是fork需要copy父进程的数据这个动作就变得毫无意了,而且还很 重,所以,搞出了个父子进程共享的vfork。所以,vfork本就是为了exec而生。

为什么return会挂掉,exit确不会

从上面我们知道,结束子进程用exit()而不是return,注意,你在vfork中return了,那么,就意味着main函数中retun了,因为父子进程共享函数栈,所以整个函数栈就跪了。

如果在子进程中return了,基本上是一下过程:

  1. 子进程的main()函数return了

  2. 而main()函数return了,通常会调用exit()或相似的函数。

  3. 这时父进程收到子进程exit(),开始从vfork返回,但是此时栈已被破坏,(注:栈会返回一个诡异一个栈地址,对于某些内核版本的实现,直接报“栈错误”就给跪了,然而,对于某些内核版本的实现,于是有可能会再次调用main(),于是进入了一个无限循环的结果,直到vfork 调用返回 error)

如图所示:

return x与exit(x)到底有什么区别

总结:returnh会释放局部变量并弹栈,回到上级函数执行,exit()会直接退掉,如果用c++就会知道,return会调用局部对象的析构函数,exit()不会,(注:exit()不是系统调用,是glibc对系统调用 _exit()或_exitgroup()的封装)

可见:子进程调用exit()函数没有修改函数栈,所有,父进程得意顺利执行

当前标题:returnx与exit(x)到底有什么区别
链接URL:https://www.cdcxhl.com/article32/pdippc.html

成都网站建设公司_创新互联,为您提供网站建设建站公司动态网站微信公众号外贸网站建设网站营销

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

h5响应式网站建设