2 gdufssheng gdufssheng 于 2013.11.25 20:32 提问

linux系统调用fork()问题!

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
求大神解释!

4个回答

u012908616
u012908616   2013.11.26 00:11

缓冲问题。 输出不是一个字符一个字符的往控制台送的, 而是一批一批的送,当你输出\n时一般会flush一下缓冲。而缓冲属于进程内可写数据内存,fork时会复制。

guomingbing12
guomingbing12   2013.11.26 19:46

个人观点:
第一种因为IO输出需要时间,所以当1 分2 , 2 分4 ,所以如此打印
第二种因为fork复制进程资源,所以IO缓冲区里面的数据一起复制,所以如此打印。
没看过相关资料,无法保证其正确性。

u012966211
u012966211   2013.11.26 21:20

主要的区别是因为有了一个 \n 回车符号 。
这就跟Printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里了,并没有实际的写到屏幕上 。
但是,只要看到有 \n 则会立即刷新stdout,因此就马上能够打印了。

max_min_
max_min_   Rxr 2013.11.26 17:38

缓冲区刷新问题!

可以把\n去掉,加上fflush(stdout); 刷新下,也是会输出的!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!