分页: 1 / 1

fork函数的问题!!!

发表于 : 2007-11-21 13:15
wewe12
#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

以上结果哪位仁兄有点合理的解释!!!

发表于 : 2007-11-21 17:58
windwiny
判断都不加? 什么态度。。。。


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



主线程退出了,所有线程退出

发表于 : 2007-11-21 21:10
hooray
:cry: 怎么跟我们做的操作系统的实验一模一样........

发表于 : 2007-11-22 7:25
vupiggy
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的活,当然难易依学校要求而定了。

发表于 : 2007-11-22 7:33
Amankwah
楼上正解 :em51 :em52

发表于 : 2007-11-22 7:40
猛将兄
你在最后加上getch()
然后打印父进程和子进程id,就都清楚了

发表于 : 2007-11-22 8:09
Amankwah
getch()????
不是吧?getch()在Linux用来貌似挺麻烦的~

发表于 : 2007-11-22 8:57
猛将兄
那就getchar()
本意就是让process不退出而已,否则你看到的,父进程就是init了,因为父进程可能早退出了

发表于 : 2007-11-24 13:22
zxkane