免费注册 查看新帖 |

Chinaunix

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

网上看到一程序,有一点不明白,求教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-17 23:10 |只看该作者 |倒序浏览
本帖最后由 nevermore4030 于 2012-03-17 23:11 编辑

  1 #include <stdio.h>
  2 #include <sys/types.h>
  3 #include <unistd.h>
  4
  5 int main()
  6 {
  7         int i=0;
  8         pid_t pid;
  9         printf("还没创建子进程\n");
10         i++;
11         pid = vfork();
12         if(pid==-1)
13         {
14         printf("fork error!\n");
15         }
16         else if(pid==0)
17         {
18         i++;
19         printf("我是子进程,id%d\n",getpid());
20         printf("我的父亲是id:%d\n",getppid());
21         printf("-----i=%d-----\n",i);
22         }
23         else
24         {
25         i++;
26         printf("我是父进程,id:%d\n",getpid());
27         printf("-----i=%d-----\n",i);
28         }
29         exit(0);
30 }
31
最后那个exit(0);换成return 0;怎么就是个段错误,为什么父进程的i不可以访问了。

论坛徽章:
1
白羊座
日期:2013-09-18 22:02:26
2 [报告]
发表于 2012-03-18 11:06 |只看该作者
看不出啊。

论坛徽章:
0
3 [报告]
发表于 2012-03-18 12:34 |只看该作者
man vfork

论坛徽章:
1
辰龙
日期:2014-05-22 11:38:58
4 [报告]
发表于 2012-03-18 16:21 |只看该作者
本帖最后由 winway1988 于 2012-03-18 16:21 编辑

man vfork里有这么一句话
The child must not return from the current function  or  call exit(), but may call _exit().

论坛徽章:
0
5 [报告]
发表于 2012-03-18 17:30 |只看该作者
其实我很想问为什么。不过它就这么写,我就这么用吧。谢谢大家了。

论坛徽章:
0
6 [报告]
发表于 2012-03-18 17:37 |只看该作者
好像是因为子进程在父进程的栈帧上操作,如果子进程return了或者exit了可能会破坏父进程的栈帧

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
7 [报告]
发表于 2012-03-18 18:30 |只看该作者
回复 6# luckysir


    re ,就是这个原因

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2012-03-18 18:47 |只看该作者
nevermore4030 发表于 2012-03-18 17:30
其实我很想问为什么。不过它就这么写,我就这么用吧。谢谢大家了。


頂樓的程序(包括將 exit(0); 改為 return 0; 的程序)其行為是未定義的,它可以段錯誤,也可以不段錯誤,或是一會出現段錯誤一會不出現,或是出現其它錯誤,沒有什麼為什麼可言。看看 vfork(2) 和 http://en.wikipedia.org/wiki/Undefined_behavior
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP