日期:2014-05-16  浏览次数:20836 次

fork()问题

int main(void)
{
printf("1 \n");
fork();
printf("2 \n");
fork();
printf("3 \n");
exit(0);
}
运行的结果是这样的:






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

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