免费注册 查看新帖 |

Chinaunix

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

fork()函数调用后为什么总是子进程先运行呢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-09 12:51 |只看该作者 |倒序浏览
#include <stdio.h>

int main()
{
    int pid;
   
    if (0 == (pid = fork())) {
        puts("child1");
        return 0;
    }
   
    if (0 == (pid = fork())) {
        puts("child2");
        return 0;
    }
   
    puts("parent");
   
    return 0;
}

这样的一段程序编译好以后运行的结果都是
child1
child2
parent
不知道为什么呢
按照我知道的操作系统的进程调度来说~在第一个fork()好了以后child1进程应该排到进程调度队列队尾等待调度
第二个也是一样
parent因为时间片没有用完会继续运行~~所以输出的第一个应该是parent

即使不是这样~posix也没有规定fork后调度的规则~应该每次结果都是不一样的啊

迷茫中> <

论坛徽章:
0
2 [报告]
发表于 2010-09-09 12:52 |只看该作者
P.S.
我用的是debian5.0

论坛徽章:
0
3 [报告]
发表于 2010-09-09 12:58 |只看该作者
这子进程和父进程哪个先是随机的吧~~~~有可能是父进程先也有可能是子进程先

论坛徽章:
0
4 [报告]
发表于 2010-09-09 13:06 |只看该作者
建议楼主试一万次  {:3_193:}

论坛徽章:
0
5 [报告]
发表于 2010-09-09 13:11 |只看该作者
规范没有规定谁先运行谁后运行,也不应该规定。
程序开发的时候,也不应该依赖于谁先谁后。

操作系统内部实现时,考虑到子进程有可能会接着执行一个exec()调用,先执行子程序可以减少共享页面的COW(copy on write),提高性能。

论坛徽章:
0
6 [报告]
发表于 2010-09-09 13:59 |只看该作者
这个问题我也遇到过,经过测试发现在某一个特定的环境下执行顺序相对固定。
例如在A环境下,顺序可能一直是123
到了B环境下,顺序可能一直是321.

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
7 [报告]
发表于 2010-09-09 17:56 |只看该作者
这个依OS实现而定。OS主观上是想要子进程先运行的,但是否如愿就不一定了。

论坛徽章:
0
8 [报告]
发表于 2010-09-09 17:59 |只看该作者
写调度器的人高兴呗...不要当成普遍规律。

论坛徽章:
0
9 [报告]
发表于 2010-09-09 18:38 |只看该作者
谁先谁后本来就是不确定的

论坛徽章:
0
10 [报告]
发表于 2010-09-09 21:31 |只看该作者
首先FORK()后,谁先运行是随机的,不同的系统环境,肯能会有所差别!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP