当前位置:  技术问答>linux和unix

printf的底层问题。 希望高手解答。(在线等)

    来源: 互联网  发布时间:2015-10-25

    本文导语:  我在书上得知:默认情况下,printf()在屏幕输出的时候是行缓冲,而将输出结果重定向到文件的时候就变了全缓冲,请问为什么会是这样?   比如: int main() {   printf("%d %dn",getpid(),getppid());   if( fork()==0 )    ...

我在书上得知:默认情况下,printf()在屏幕输出的时候是行缓冲,而将输出结果重定向到文件的时候就变了全缓冲,请问为什么会是这样?
  比如:

int main() {
  printf("%d %dn",getpid(),getppid());
  if( fork()==0 )
      printf("%d %dn",getpid(),getppid());
  return 0;
}

编译成a.out后,如果直接运行 #./a.out,  结果如下:
20817   20801
20818   1
但是运行 #./a.out >out,然后查看out里的内容,结果如下:
20822   20801
20822   20801
20823   1

  所以想问问既然a.out都已经编译好了,为什么重定向后printf的缓存会发生变化,是什么原因引起的。 还有请问一下printf在什么时候全缓冲,什么时候行缓冲?  谢谢了。

|
printf到终端设备的属于行缓存,否则属于全缓存,比如你说的输出到文件。 
全缓存的话,每fork一个子进程,子进程完全拷贝父进程的数据段,所以在父进程中存在的printf也会被拷贝到子进程,所以在父进程中的printf就会被打印两次。

|
设置行缓冲.

#include 
#include 
#include 

int
main(void)
{
  char buf[BUFSIZ];
  pid_t pid;

  setvbuf(stdout,(char *)NULL,_IOLBF,0);

  printf("%d %dn",getpid(),getppid());

  if((pid=fork()) == 0){
    printf("%d %dn",getpid(),getppid());
  }
  return(0);
}



    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 100分难题,高手帮忙。关于printf的问题。
  • java命名空间java.io类console的类成员方法: printf定义及介绍
  • 为什么会我调试程序的时候出现“printf.c: 没有那个文件或目录. in printf.c“
  • java命名空间java.io类printstream的类成员方法: printf定义及介绍
  • UDP包何printf?
  • java命名空间java.io类printwriter的类成员方法: printf定义及介绍
  • Linux 中的printf、open、close
  • Python中类似printf的字符串格式化详解
  • [求解]关于printf 与 ++ --的疑惑
  • printf的静态库在哪??
  • Eclipse对printf()不能输出到控制台的快速解决方法
  • printf显示的问题.
  • printf的奇怪现象
  • linux printf文字编码设定?
  • 如何使用ar命令检查在标准的C库中收藏了多少与printf相关的函数
  • 如何在printf()中指定字段的宽度后,左端的用数字0而不用空格补全
  • 送分题,关于printf输出格式的问题。
  • 问个printf的问题
  • UART_printf在哪里?
  • printf到指定终端
  • ld 报undefined reference to `printf'求解决方法
  • printf的问题 为什么没有输出


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3