免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4225 | 回复: 10
打印 上一主题 下一主题

return与exit【已解决】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-14 15:48 |只看该作者 |倒序浏览
本帖最后由 lishiyong110 于 2010-03-15 21:01 编辑

return与exit在多进程中好像有很大的区别,下面这段代码:
  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <unistd.h>

  4. int main(void)
  5. {
  6.         pid_t pid;
  7.         int ret = 0;

  8.         if ((pid = vfork()) < 0)
  9.                 printf("Fork error:%s\n", strerror(errno));
  10.         else if (pid == 0){
  11.                 ret++;
  12.                 printf("This is child!The ret is %d\n", ret);
  13.                 exit (0);
  14. //                return 0;
  15.         }
  16.         else{
  17.                 printf("This is father!The ret is %d\n", ret);
  18.         }

  19.         return 0;
  20. //        exit(0);
  21. }
复制代码
如果不使用exit,而使用return那么在fedora下程序在反复的执行,而在ubuntu下则会输出下面这样的结果
  1. This is child!The ret is 1
  2. This is father!The ret is -1209189331
复制代码
想在这里询问下return与exit在这种情况下有什么去区别呢?在网上查找了很多资料都没有介绍在多线程中return与exit的区别的,希望了解的能指导下

论坛徽章:
0
2 [报告]
发表于 2010-03-14 16:09 |只看该作者
回复 1# lishiyong110


    问题出在vfork,你换成fork应该没有问题

      vfork()  differs  from  fork(2) in that the parent is suspended until the child terminates (either normally, by calling
       _exit(2), or abnormally, after delivery of a fatal signal), or it makes a call to execve(2).   Until  that  point,  the
       child  shares  all memory with its parent, including the stack. The child must not return from the current function or
       call exit(3), but may call _exit(2).


LZ可以 man 2 _exit 和 man 3 exit看两者区别

论坛徽章:
0
3 [报告]
发表于 2010-03-14 23:01 |只看该作者
我认为exit是直接退出程序了

论坛徽章:
0
4 [报告]
发表于 2010-03-15 12:57 |只看该作者
回复 2# zx_wing

exit是退出程序,return应该是一个返回的函数调用 但是return放回到哪里了呢?还是不太清楚...

论坛徽章:
0
5 [报告]
发表于 2010-03-15 15:19 |只看该作者
return 之后main函数就返回了,然后exit还是会被调用……

问题的关键就如zx_wing 兄所说,不在于调没调用exit,而在于什么时候调用exit。

vfork后,父子进程是共用一个栈的。内核会让父进程暂时挂起,等子进程退出后才继续运行(其实不一定要退出,只要释放其所引用的地址空间就行,比如调用exec执行新的程序)。
子进程从调用vfork的函数中return,调用栈就给破坏了。等子进程退出,父进程继续运行时,就出问题了。

关于 vfork,有兴趣可以看看这篇文章:http://hi.baidu.com/_kouu/blog/item/3e92640e3b6393e4ab645784.html

论坛徽章:
0
6 [报告]
发表于 2010-03-15 21:00 |只看该作者
回复 5# kouu


恩 大致了解了 谢谢 你推荐的那片文章也很不错 介绍的很清楚

论坛徽章:
0
7 [报告]
发表于 2010-03-16 00:02 |只看该作者
解答的精辟!学习了!

论坛徽章:
0
8 [报告]
发表于 2010-03-16 08:09 |只看该作者
解释得不错啊!学习喽。

论坛徽章:
0
9 [报告]
发表于 2010-05-26 14:19 |只看该作者
好贴,帮顶一下,希望可以被更多的人看到!呵呵……
还有,此帖可精华了!!

论坛徽章:
0
10 [报告]
发表于 2010-05-26 21:50 |只看该作者
讲的很好,虽然我也知道不能这样用。这样反回地址就被覆盖了。但是我并没有把其中的原由完全搞懂,请高人指点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP