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
求大神解释!
------解决方案--------------------占沙发了。
是因为缓冲区的问题。printf linux io自带缓冲区的。
在你printf后数据其实还在缓冲区。当你fork子进程的时候
子进程连缓冲区中的数据一起copy了过去。也就是说
如果你在父进程中printf 1,然后fork子进程,子进程创建的时候
io缓冲区中已经有了1这个数据,这样当你printf2的时候子进程的缓冲区
其实是1,2两个数据。
------解决方案--------------------这个很好理解
1---->2----->3
------解决方案-------------------- ------解决方案---------------------->3
------解决方案---------------------->2------3
------解决方案---------------------->3
\n是刷新缓冲,没有\n刷新,1在缓冲力也会被复制,刷新了,缓冲是空的,复制不到东西。
------解决方案--------------------沙发兄弟已经说的很对了,结贴吧。