int main(void)
{
printf("1 \n");
fork();
printf("2 \n");
fork();
printf("3 \n");
exit(0);
}
运行的结果是这样的:
1
2
3
2
3
3
3 ;
然后把'\n'去掉,变成这样的代码:
int main(void)
{
printf("1 ");
fork();
printf("2 ");
fork();
printf("3 ");
exit(0);
}
后,结果变成这样:
1 2 3 1 2 3 1 2 3 1 2 3
求大神解释!
缓冲问题。 输出不是一个字符一个字符的往控制台送的, 而是一批一批的送,当你输出\n时一般会flush一下缓冲。而缓冲属于进程内可写数据内存,fork时会复制。
缓冲区刷新问题!
可以把\n去掉,加上fflush(stdout); 刷新下,也是会输出的!
个人观点:
第一种因为IO输出需要时间,所以当1 分2 , 2 分4 ,所以如此打印
第二种因为fork复制进程资源,所以IO缓冲区里面的数据一起复制,所以如此打印。
没看过相关资料,无法保证其正确性。
主要的区别是因为有了一个 \n 回车符号 。
这就跟Printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上 。
但是,只要看到有 \n 则会立即刷新stdout,因此就马上能够打印了。