返回x (x)与出口到底有什么区别

  

返回x (x)与出口到底有什么区别

<人力资源/>

书中说主要函数返回相当于

退出(主(命令行参数个数,argv))

但实践中出了点问题

返回x (x)与出口到底有什么区别

运行结果:

返回x (x)与出口到底有什么区别

如果把退出换成返回确不会。


首先说说叉与vfork的区别

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

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

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


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

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

<李>

子进程的主要()函数返回了

<李>

而主要()函数返回了,通常会调用exit()或相似的函数。

<李>

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

如图所示:

返回x (x)与出口到底有什么区别

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

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


返回x (x)与出口到底有什么区别