Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40854
  • 博文数量: 13
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 165
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-12 14:18
文章分类

全部博文(13)

文章存档

2011年(1)

2010年(3)

2009年(4)

2008年(5)

我的朋友

分类: C/C++

2009-07-21 15:40:53

  先看三段代码:
  代码一:
    #include
    #include
 
    int main()
    {
            int i;
            for( i=0; i<10; i++ )
            {
                   printf("*");
                   sleep(1);
            }
            printf("\n");
            return;
    }
执行此代码,10s后一次性输出10个"*"字符;
  代码二:
    #include
    #include
 
    int main()
    {
            int i;
            for( i=0; i<10; i++ )
            {
                   printf("*");
                   fflush(stdout);
                   sleep(1);
            }
            printf("\n");
            return;
    }
执行此代码,每隔1s输出一个"*"字符;
  代码三:
    #include
    #include
 
    int main()
    {
            int i;
            for( i=0; i<10; i++ )
            {
                   printf("*\n");
                   sleep(1);
            }
            printf("\n");
            return;
    }
执行此代码,每隔1s输出一个"*"字符,只是每行一个。
  代码一与代码二和代码三的输出有很大的区别,是因为:printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里,并没有实际的写到屏幕上,但是,只要看到有\n(因为是行缓冲)则会立即刷新stdout,因此就能马上打印了。如果想printf("*");马上打印,就得使用fflush(stdout)强迫把stdout内容输出并清空stdout缓存。
  fflush清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件,英文描述是:The function fflush() forces a write of all user-space buffered data for the given output or update stream via the stream’s underlying write function. The open status of the stream is unaffected. If the stream argument is NULL, fflush() flushes all open output streams.
  原型:int fflush(FILE *stream);
  有了上面的基础之后来看下面两段程序:
  代码四:
    #include
    #include
   
    int main()
    {
            printf("Hello");
            fork();
            return;
    }
执行此代码,输出两个"Hello";
  代码五:
    #include
    #include
   
    int main()
    {
            printf("Hello\n");
            fork();
            return;
    }
执行此代码,输出一个"Hello"。
  这两段代码的输出不同的原因是:正如上文所讲,当printf("Hello");没有\n时,不是把字符马上输出到屏幕而是保存在缓冲区中,直到程序退出的时候才打印出来,此时调用fork创建子进程,子进程把父进程的空间都拷贝过来,包括缓冲区中的内容,stdout缓冲区中有"Hello",所以子进程在退出的时候也要输出"Hello",这样就出现了两次"Hello"。当printf("Hello\n");有\n时,马上把字符打印到屏幕而不保存到缓冲区中,所以只打印一个"Hello"。
  在printf("Hello");后加上fflush(stdout);之后,执行程序,只输出一个"Hello",就是上面的原因。
阅读(584) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~