当前位置: 技术问答>linux和unix
请教高手,刚学OS,碰到一个进程的问题,帮忙看一下
来源: 互联网 发布时间:2016-04-19
本文导语: #include main() { int p1; printf("hello"); printf(" ana "); //这个语句 while((p1=fork())==-1); if(p1==0) printf(" In son p1=%dn",p1); else printf(" In parent p1=%dn",p1); } 输出为: hello a a In son p1=0 a In parent p...
#include
main()
{
int p1;
printf("hello");
printf(" ana "); //这个语句
while((p1=fork())==-1);
if(p1==0)
printf(" In son p1=%dn",p1);
else
printf(" In parent p1=%dn",p1);
}
输出为:
hello a
a In son p1=0
a In parent p1=8533
再把注释的语句中的n用空格替代即:printf(" a a ");编译运行结果如下:
hello a a In son p1=0
hello a a In parent p1=8605
分析一下结果,少了'hello a',这是什么原因?请高手们帮小弟解决这个问题
main()
{
int p1;
printf("hello");
printf(" ana "); //这个语句
while((p1=fork())==-1);
if(p1==0)
printf(" In son p1=%dn",p1);
else
printf(" In parent p1=%dn",p1);
}
输出为:
hello a
a In son p1=0
a In parent p1=8533
再把注释的语句中的n用空格替代即:printf(" a a ");编译运行结果如下:
hello a a In son p1=0
hello a a In parent p1=8605
分析一下结果,少了'hello a',这是什么原因?请高手们帮小弟解决这个问题
|
是后一个多了一个hallo a吗?
那就是标准IO库惹的惑,终端是行缓冲的,所以当你加入一个n时在fork之前会把hello a输出,而不加n时,会把hello a a缓存起来,fork后也就父子进程都有了,然后父子进程里面:
if(p1==0)
printf(" In son p1=%dn",p1);
else
printf(" In parent p1=%dn",p1);
直到读到n才真正输出。
这个APUE里很详细的解释哦。
那就是标准IO库惹的惑,终端是行缓冲的,所以当你加入一个n时在fork之前会把hello a输出,而不加n时,会把hello a a缓存起来,fork后也就父子进程都有了,然后父子进程里面:
if(p1==0)
printf(" In son p1=%dn",p1);
else
printf(" In parent p1=%dn",p1);
直到读到n才真正输出。
这个APUE里很详细的解释哦。
|
执行流虽然从fork开始,但是数据(地址空间的数据)却是完全写时拷贝的,缓冲区是地址空间的一部分,执行流是个动态的概念,本问题牵扯到冯氏机器的特性,实际上如果执行流可以倒回去(pc寄存器不是加1,而是减1)的话,子进程完全可以回到main的开始的。冯氏机器中的两个最最重要的概念就是执行和存储。建议楼主先学习一下最最基本的概念。