免费注册 查看新帖 |

Chinaunix

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

fork后为何子进程先执行了呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-27 13:35 |只看该作者 |倒序浏览
本帖最后由 xiabeizi 于 2010-12-27 14:08 编辑
  1. #include <stdio.h>
  2. #include <sched.h>

  3. int data = 10;

  4. int child_process()
  5. {
  6. printf("Child process %d, data %d\n",getpid(),data);
  7. data = 20;
  8. printf("Child process %d, data %d\n",getpid(),data);
  9. while(1);//没起作用,为何?
  10. }

  11. int main(int argc, char* argv[])
  12. {
  13. if(fork()==0) {
  14. child_process();
  15. }
  16. else{
  17. sleep(1);
  18. printf("Parent process %d, data %d\n",getpid(), data);
  19. while(1);//起作用了,为何?
  20. }
  21. }
复制代码
大家请看上面的代码,我理解的是应该是fork之后,是父进程继续执行啊,休息一秒后输出“Parent process …………”
可是实际输出结果是子进程先运行,输出:
  1. Child process 5209, data 10
  2. Child process 5209, data 20
  3. Parent process 5208, data 10
复制代码
可是又有一疑问,如果是子进程先执行的话为何child_process()中while(1)没起作用呢?

按我的知识基础,如果想让子进程先执行的话应该是用vfork啊,并且是在对子进程进行exit之后你进程才运行的。

难道是sleep的问题么?sleep是把当前进程挂起,把处理器让给其它进程,可是我把sleep(1)注释掉后,发现跟上面的运行结果一样啊?
怎么回事呢?

论坛徽章:
0
2 [报告]
发表于 2010-12-27 13:58 |只看该作者
为啥没人呢?

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
3 [报告]
发表于 2010-12-27 15:27 |只看该作者
sleep是一个原因我觉得。应该是随机的阿。多运行几次结果都一样吗?

论坛徽章:
0
4 [报告]
发表于 2010-12-27 16:04 |只看该作者
可能是下面这个原因~
“至于父子进程哪个先运行,可能与操作系统(调度算法)有关,而且这个问题在实际应用中并不重要,如果需要父子进程协同,可以通过原语的办法解决。”

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2010-12-27 16:57 |只看该作者
vfork了吧?

论坛徽章:
0
6 [报告]
发表于 2010-12-27 18:38 |只看该作者
执行结果很正常,父进程sleep 1秒,子进程获取到执行时间,然后进入死循环,接着父进程执行,然后父进程进入死循环。

你怎么知道子进程的死循环没有生效?


fork()以后,父子执行的先后顺序理论是随机的,但是又和内核的调度算法有关,去掉sleep结果一样,可能是因为调度算法的原因。linux的基本调度算法是根据已执行时间和未执行时间以及变化的优先级确定的,可以网上搜下先。

论坛徽章:
0
7 [报告]
发表于 2010-12-27 20:05 |只看该作者
linux下, 通常fork以后子进程先执行
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP