当前位置: 技术问答>linux和unix
一个简单却不知道为什么出错的程序(附源码)?
来源: 互联网 发布时间:2015-11-10
本文导语: #include main() { int p1,p2; //printf("p1=%d,p2=%dn",p1,p2); 带换行 //printf("p1=%d,p2=%d",p1,p2); 不带换行 while((p1=fork())==-1); if(p1==0 putchar('b'); else{ while((p2=fork())==-1); if(p2==0) p...
#include
main()
{
int p1,p2;
//printf("p1=%d,p2=%dn",p1,p2); 带换行
//printf("p1=%d,p2=%d",p1,p2); 不带换行
while((p1=fork())==-1);
if(p1==0
putchar('b');
else{
while((p2=fork())==-1);
if(p2==0)
putchar('c');
else putchar('a');
}
}
在linux下编译,运行不带换行的printf,结果能正确的显示3次p1=...p2=....
而用带换行的那个printf,却只能显示1次p1=....p2=
这是怎么回事?
main()
{
int p1,p2;
//printf("p1=%d,p2=%dn",p1,p2); 带换行
//printf("p1=%d,p2=%d",p1,p2); 不带换行
while((p1=fork())==-1);
if(p1==0
putchar('b');
else{
while((p2=fork())==-1);
if(p2==0)
putchar('c');
else putchar('a');
}
}
在linux下编译,运行不带换行的printf,结果能正确的显示3次p1=...p2=....
而用带换行的那个printf,却只能显示1次p1=....p2=
这是怎么回事?
|
默认情况下标准输出是行缓冲的,就是说直到一行结束时缓冲区内容才全部显示到屏幕上。带换行的时候,printf("p1=%d,p2=%dn",p1,p2); 执行完屏幕上就有输出,缓冲区也清空了,所以三个进程显示1次p1=....p2=。。。后面跟abc(出现顺序是任意的),
printf("p1=%d,p2=%d",p1,p2);执行完屏幕上没有输出,缓冲区非空,存放着将要输出的内容,fork完后父子进程将有同样的输出缓冲区,当进程结束后会刷新,所以将有三个p1=....p2=。。。而且每个后面跟abc其中之一,顺序也是任意的。
printf("p1=%d,p2=%d",p1,p2);执行完屏幕上没有输出,缓冲区非空,存放着将要输出的内容,fork完后父子进程将有同样的输出缓冲区,当进程结束后会刷新,所以将有三个p1=....p2=。。。而且每个后面跟abc其中之一,顺序也是任意的。
|
在fork前用scanf读入数据,看看子进程是否会再次等待输入,OK?