当前位置: 技术问答>linux和unix
linux C编程,return 和exit的区别
来源: 互联网 发布时间:2016-05-04
本文导语: 相关代码如下 ...... int main() { pid_t pid; int number = 1; pid = vfork(); if(pid == 0) { printf("%dn",number); number++; return 0; // exit(0); } printf("%dn",number); ...
相关代码如下
我知道vfork会阻塞父进程,以保证子进程先运行。
现在出现的情况是,当在子进程中用return 0;结束子进程时之后,继续执行父进程会有错误数据被输出来。
但用exit(0);时,整个程序都输出正常。
我的问题,为什么用return 0和exit(0)会不一样?
在这个程序中,它们有什么区别?
谢谢
......
int main()
{
pid_t pid;
int number = 1;
pid = vfork();
if(pid == 0)
{
printf("%dn",number);
number++;
return 0;
// exit(0);
}
printf("%dn",number);
return 0;
}
我知道vfork会阻塞父进程,以保证子进程先运行。
现在出现的情况是,当在子进程中用return 0;结束子进程时之后,继续执行父进程会有错误数据被输出来。
但用exit(0);时,整个程序都输出正常。
我的问题,为什么用return 0和exit(0)会不一样?
在这个程序中,它们有什么区别?
谢谢
|
这个没有什么好说的,vfork后,在子进程内正确的系统调用只有两个选择:exec和_exit.
return会返回到并不存在的stack frame.
exit会刷新和关闭标准IO,这会破坏父进程的标准IO数据结构。
以上这些都是在vfork手册页里的。
http://www.opengroup.org/onlinepubs/009695399/functions/vfork.html
return会返回到并不存在的stack frame.
exit会刷新和关闭标准IO,这会破坏父进程的标准IO数据结构。
以上这些都是在vfork手册页里的。
http://www.opengroup.org/onlinepubs/009695399/functions/vfork.html
|
return和exit的区别以及为什么vfork的子进程不能return http://devcool.cn devcool编写 2008-12-24
exit()用于退出整个程序,也就是说它将控制权交给操作系统。
在执行了exit()后,所有的内存和临时存储区会被刷新,所有的文件会被关闭,控制权不再在程序这里,exit()还会调用终止处理程序,可以用atexit函数来注册一个终止处理程序,将来在exit()中会被调用。多次调用exit()函数,行为是未定义的,这种情况我们基本不用操心。和exit()类似的 _exit()和_Exit()函数不会处理这些任务,直接将控制权交给操作系统。相比较,return()语句是从函数返回,并且将控制权交给调用函数。注意这里return仅仅是从函数返回,去交还控制权,在return和交换控制权期间会发生一些事情。交出控制权后又干了什么和return没关系了。
先看一个简单的c++ 程序:
#include
using namespace std;
class A
{
public:
~A();
};
A::~A()
{
cout
exit()用于退出整个程序,也就是说它将控制权交给操作系统。
在执行了exit()后,所有的内存和临时存储区会被刷新,所有的文件会被关闭,控制权不再在程序这里,exit()还会调用终止处理程序,可以用atexit函数来注册一个终止处理程序,将来在exit()中会被调用。多次调用exit()函数,行为是未定义的,这种情况我们基本不用操心。和exit()类似的 _exit()和_Exit()函数不会处理这些任务,直接将控制权交给操作系统。相比较,return()语句是从函数返回,并且将控制权交给调用函数。注意这里return仅仅是从函数返回,去交还控制权,在return和交换控制权期间会发生一些事情。交出控制权后又干了什么和return没关系了。
先看一个简单的c++ 程序:
#include
using namespace std;
class A
{
public:
~A();
};
A::~A()
{
cout