fork函数的问题!!!

软件和网站开发以及相关技术探讨
回复
wewe12
帖子: 54
注册时间: 2007-08-27 16:19

fork函数的问题!!!

#1

帖子 wewe12 » 2007-11-21 13:15

#include<stdio.h>
int main()
{
fork();
fork();
fork();
fork();
printf("A\n");
}


GCC编译后的结果!
A
A
A
[root@local host root]#A
A
A
A
A
A
A
A
A
A
A
A
A


另外一个程序!
include<stdio.h>
int main()
{
int i,pid;
pid=fork();
if(pid==0)
{
for(i=0;i<5;i++)
{
printf("I am child\n");
sleep();
}
}
if(pid>0)
{
fot(i=0;i<5;i++)
{
printf("I am parent\n");
sleep();
}
}
else
printf("error\n");
}
GCC编译结果
I am child
I am parent
I am parent
I am child
I am parent
I am child
I am parent
I am child
I am parent
I am child

以上结果哪位仁兄有点合理的解释!!!
头像
windwiny
帖子: 2254
注册时间: 2007-03-13 17:26

#2

帖子 windwiny » 2007-11-21 17:58

判断都不加? 什么态度。。。。


最极端的情况是只打印一个A



主线程退出了,所有线程退出
hooray
帖子: 1
注册时间: 2007-11-03 19:53

#3

帖子 hooray » 2007-11-21 21:10

:cry: 怎么跟我们做的操作系统的实验一模一样........
vupiggy
帖子: 89
注册时间: 2006-03-19 18:25
来自: FZ->TJ->PEK->AMS->MTL

#4

帖子 vupiggy » 2007-11-22 7:25

Linux下不会出现只打印一个A出来的情况。总是打印16个A。理由很简单,就是每个被fork出来的子进程会继续执行程序后面的指令,即继续fork,于是没一次fork,总进程数量是原来的两倍,总数就是2^4=16。fork出来的是进程,和线程一点关系都没有,父进程结束了,子进程照样继续。如果看到像这样的情况:
A
A
A
[root@local host root]#A
A
A
...

应该是某些子(孙)进程先被调度,而后父进程被调度,当它结束时,释放了终端,于是就出现这种打印被一行终端提示隔开的情况。不过我不是特别确信是不是因为这个原因。


至于children,parent打印的无规则性,就是标准的竞争条件(race condition)在作怪,你无法预测fork出来的子进程和原来的父进程哪个先被调度,在他们运行过程中,也无法预测什么时候哪个进程何时会被调度何时会被切换。

BTW: 这个作为OS的实验有点简单了,一般会作为所谓的system programming这样的课程里的实验。OS的作业基本都是kernel hacking的活,当然难易依学校要求而定了。
头像
Amankwah
帖子: 624
注册时间: 2006-10-16 7:24
来自: 安康/西安/广州
联系:

#5

帖子 Amankwah » 2007-11-22 7:33

楼上正解 :em51 :em52
读书取正,读易取变,读骚取幽,读庄取达,读汉文取坚,最有味卷中岁月。
与菊同野,与梅同疏,与莲同洁,与兰同芳,与海棠同韵,定自称花里神仙。
头像
猛将兄
帖子: 2052
注册时间: 2005-10-19 17:33

#6

帖子 猛将兄 » 2007-11-22 7:40

你在最后加上getch()
然后打印父进程和子进程id,就都清楚了
头像
Amankwah
帖子: 624
注册时间: 2006-10-16 7:24
来自: 安康/西安/广州
联系:

#7

帖子 Amankwah » 2007-11-22 8:09

getch()????
不是吧?getch()在Linux用来貌似挺麻烦的~
读书取正,读易取变,读骚取幽,读庄取达,读汉文取坚,最有味卷中岁月。
与菊同野,与梅同疏,与莲同洁,与兰同芳,与海棠同韵,定自称花里神仙。
头像
猛将兄
帖子: 2052
注册时间: 2005-10-19 17:33

#8

帖子 猛将兄 » 2007-11-22 8:57

那就getchar()
本意就是让process不退出而已,否则你看到的,父进程就是init了,因为父进程可能早退出了
zxkane
帖子: 103
注册时间: 2007-11-02 10:46

#9

帖子 zxkane » 2007-11-24 13:22

回复