当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : fork函数的问题!!!
帖子发表于 : 2007-11-21 13:15 

注册: 2007-08-27 16:19
帖子: 54
送出感谢: 0 次
接收感谢: 0 次
#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

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


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2007-11-21 17:58 
头像

注册: 2007-03-13 17:26
帖子: 2254
送出感谢: 0 次
接收感谢: 1
判断都不加? 什么态度。。。。


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



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


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2007-11-21 21:10 

注册: 2007-11-03 19:53
帖子: 1
送出感谢: 0 次
接收感谢: 0 次
:cry: 怎么跟我们做的操作系统的实验一模一样........


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2007-11-22 7:25 

注册: 2006-03-19 18:25
帖子: 89
地址: FZ->TJ->PEK->AMS->MTL
送出感谢: 0 次
接收感谢: 0 次
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的活,当然难易依学校要求而定了。


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2007-11-22 7:33 
头像

注册: 2006-10-16 7:24
帖子: 624
地址: 安康/西安/广州
送出感谢: 0 次
接收感谢: 0 次
楼上正解 :em51 :em52


_________________
读书取正,读易取变,读骚取幽,读庄取达,读汉文取坚,最有味卷中岁月。
与菊同野,与梅同疏,与莲同洁,与兰同芳,与海棠同韵,定自称花里神仙。


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2007-11-22 7:40 
头像

注册: 2005-10-19 17:33
帖子: 2052
送出感谢: 0 次
接收感谢: 0 次
你在最后加上getch()
然后打印父进程和子进程id,就都清楚了


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2007-11-22 8:09 
头像

注册: 2006-10-16 7:24
帖子: 624
地址: 安康/西安/广州
送出感谢: 0 次
接收感谢: 0 次
getch()????
不是吧?getch()在Linux用来貌似挺麻烦的~


_________________
读书取正,读易取变,读骚取幽,读庄取达,读汉文取坚,最有味卷中岁月。
与菊同野,与梅同疏,与莲同洁,与兰同芳,与海棠同韵,定自称花里神仙。


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2007-11-22 8:57 
头像

注册: 2005-10-19 17:33
帖子: 2052
送出感谢: 0 次
接收感谢: 0 次
那就getchar()
本意就是让process不退出而已,否则你看到的,父进程就是init了,因为父进程可能早退出了


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2007-11-24 13:22 

注册: 2007-11-02 10:46
帖子: 103
送出感谢: 0 次
接收感谢: 0 次
仔细看看这个
http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译