#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
以上结果哪位仁兄有点合理的解释!!!
fork函数的问题!!!
-
- 帖子: 54
- 注册时间: 2007-08-27 16:19
-
- 帖子: 89
- 注册时间: 2006-03-19 18:25
- 来自: FZ->TJ->PEK->AMS->MTL
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的活,当然难易依学校要求而定了。
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
- 来自: 安康/西安/广州
- 联系:
- Amankwah
- 帖子: 624
- 注册时间: 2006-10-16 7:24
- 来自: 安康/西安/广州
- 联系:
-
- 帖子: 103
- 注册时间: 2007-11-02 10:46