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

菜鸟问题!!!!fork 与stdout 缓冲区问题??????
如下:

int   main   (void)
{
    printf   ( "This   is   my   output ");
    fork();
    return   0;
}

输出结果为:This   is   my   output.This   is   my   output.

为什么会输出两次,我在子进程中没有任何操作.最好能否画出类似下面的图表,万分感激....


父进程的文件描述符表                                               系统文件表
[0]|_________|---->                                                 |_________|
[1]|_________|----->                                               |_________|
[2]|_________|------>                                             |_________|
[3]|_________|------->                                           |_________|
      |_________|                                                           |_________|


子进程的文件描术符表                                              
[0]|_________|------------->
[1]|_________|-------->
[2]|_________|---------->
[3]|_________|----------->

希望通过上面的程序,画出这样的表格说明父进程的文件描述符与子进程的文件描述符与共享的系统文件表三者之间的关系.

这个小程序虽然非常小,但是输出的的结果我真是搞不明白.
我试过在这句代码里   printf   ( "This   is   my   output.\n/*后面加了个换行符*/ ");
输出的结果就是一行了,但不明白是为什么.
书上解释由于stdout   是标准的行缓冲输出.
只是想知道,这两个进程在内存中的真实的形态与共享的系统文件表之间的关系.
为什么会输出两次我在子进程中没有任何操作.

------解决方案--------------------
printf ( "This is my output ");后打印的内容在缓冲区里,fork后,父子进程的缓冲区里也是相同的,进程退出时,缓冲区输出到屏幕,所以有两份。
------解决方案--------------------
终端为行缓冲模式时上面的说法才是正确的。
------解决方案--------------------
printf ( "This is my output\n ");
缓冲区的数据在fork之前已经输出的屏幕了,此时缓冲区里没有数据了。