return和exit函数的区别
在上Linux课的时候,老师提到一句,调用vfork产生的子进程就是为了使用exec族函数来执行其他的代码逻辑。
在子进程退出的时候有两种方式,exit和exec族函数,不能使用return,为什么不能用return呢,为什么只有vfork会不让用return呢?
于是我就写了这样的代码
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h> int main()
{
pid_t pid;
pid=vfork();
if(pid==)
{
//child
printf("I am child pid:%d\n",getpid());
····
return 0; }
else
{
//father
printf("I am father pid:%d\n",getpid());
}
return ;
}
不出所料出错了
而且根据操作系统的版本不同,出错结果可能不同,有的系统可能会死循环,一直交替输出上面图中的两句话。
那么,为什么呢?return 和 exit 函数都可以让一个进程结束,为什么结果会有这么大的差距呢?而且为什么fork没事,vfork就会有错呢?
首先先找他们之间的不同点,fork和vfork最大的不同当然就是父子进程的地址空间问题了,vfork产生的子进程和父进程共用同一个地址空间,那么也就是说,从地址空间的底部到顶部,全是通用的,一个改了,另外一个的数据也就被修改了。
然后我们再看return 和 exit ,简单的来说都是退出用的,会刷新缓冲区之类的,然后退出,但是!从字面意思可以看出return有返回的意思,我之前的博客讲述过函数栈帧的构造方式,当函数返回上一级调用它的函数的时候,栈帧中的指针会产生移动,“返回”的意义就在这里!!!返回上一级调用它的函数,然后修改栈帧指针以返回,那么再看之前说的vfork产生的子进程和父进程是共用地址空间的,那么栈也包含在里面咯~,子进程一旦使用return就会把栈(其中的函数栈帧,尤其是main)改写!简单的说就是子进程把main干掉的时候顺手就把父进程也拉上了,父进程表示什么都不知道就死了。。。这时候系统会报段错误,但是有的操作系统会让父进程回到main重新执行,所以就死循环了。。。
请大家批评指正。。。
return和exit函数的区别的更多相关文章
- ABAP中RETURN与EXIT语句的区别
EXIT:1) EXIT如果出现在循环中,退出的是整个循环操作,.程序会从循环结束处开始继续执行,其作用相当于Java与C++中的break.2)EXIT如果出现在循环之外,退出的是当前执行的程序块( ...
- 引用 exit、return、_exit、_Exit这几个函数的区别
引用 exit.return._exit._Exit这几个函数的区别 一.exit函数和return函数的主要区别是: exit用于在程序运行的过程中随时结束程序,其参数是返回给OS的.也可以这么讲: ...
- Linux C _exit函数与exit函数的联系与区别
一.联系 1.功能上,_exit和exit函数都是让进程正常退出,即关闭进程所打开的文件描述符,释放已占用内存和其他资源. 二.区别 1._exit函数在头文件unistd.h中声明,而exit在头文 ...
- exit()与_exit()函数的区别(Linux系统中)
注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...
- linux系统编程之进程(四):进程退出exit,_exit区别即atexit函数(转载)
一,进程终止有5种方式: 正常退出: 从main函数返回 调用exit 调用_exit 异常退出: 调用abort 由信号终止 二,exit和_exit区别: 关于_exit(): #include ...
- 循环结构中break、continue、return和exit的区别
1. break break语句的使用场合主要是switch语句和循环结构.在循环结构中使用break语句,如果执行了break语句,那么就退出循环,接着执行循环结构下面的第一条语句.如果在多重嵌套循 ...
- Linux编程return与exit区别
Linux编程return与exit区别 exit 是用来结束一个程序的执行的,而return只是用来从一个函数中返回. return return 表示从被调函数返回到主调函数继续执行,返回时可附 ...
- Windows下return,exit和ExitProcess的区别和分析
通常,我们为了使自己的程序结束,会在主函数中使用return或调用exit().在windows下还有ExitProcess()和TerminateProcess()等函数. 本文的目的是比较以上几种 ...
- C++中的return和exit区别
在main函数中,return和exit经常混用,两者的一个区别:return会执行statck unwinding,而exit不会.如果触发了信号,exit也同样不会做stack unwinding ...
随机推荐
- sudo执行脚本找不到环境变量
sudo执行脚本找不到变量 问题 当普通用户下,设置并export一个变量,然后利用sudo执行echo命令,能得到变量的值,但是如果把echo命令写入脚本,然后再sudo执行脚本,就找不到变量,未能 ...
- angularjs jquery thinkPHP3.2.3 相结合小实例
angular1.5 与 jquery想结合一个小应用 index.html <html> <head> <meta charset="utf-8"& ...
- eclipse将编辑栏一分为二
今天无意中发现一个MyEclipse的功能,CTRL SHIF - 三个键一起按下时,同一个编辑窗口会一分为二.这样我们写下面代码需要参考前面代码的时候就很方便了.
- 阿里 classloader
http://blog.csdn.net/scythe666/article/details/51956047
- linux 平均负载 load average 的含义
load average 的含义 平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数. 以路况为例, 单核CPU.单车道 情况如下: 0.00-1. ...
- do-while语句
一.语句格式格式1:do 语句1;while (条件表达式); 格式2:do { 语句1; 语句2; -}while (条件表达式); 语句执行过程:1.执行一遍循环体.2.求出作为循环条件的 ...
- [PAT]数列求和(20)
#include "stdio.h" #include "malloc.h" #include "math.h" void calc(int ...
- 纸上谈兵:表(list)
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 表 表(list)是常见的数据结构.从数学上来说,表是一个有序的元素集合.在C语言 ...
- linux+php+apache+mysql(mariadb)故障排除
wordpress 网页文件打不开(client denied by server).白屏(http 500)问题排除顺序 1.查看apache错误日志查照问题报告找到问题 “client denie ...
- django1.7取消syncdb后不能创建model相应表的问题
一.在运行一个django程序时,无法创建自定义model相应的表. 我检查seetings.py文件,发现自定义的app,blog已经写到INSTALLED_APPS中, INSTALLED_APP ...