Chinaunix首页 | 论坛 | 博客
  • 博客访问: 429171
  • 博文数量: 132
  • 博客积分: 2511
  • 博客等级: 大尉
  • 技术积分: 1385
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-11 15:10
文章分类

全部博文(132)

文章存档

2012年(18)

2011年(35)

2010年(60)

2009年(19)

分类: LINUX

2011-02-25 19:54:17

来源在些:

下面贴内容。
=================

下面的一段代码,想先把标准输出关闭,printf一些东西;然后把标准输出再恢复;
可是却达不到效果,aaaa。。。 和 bbbb。。都打出来了;
可是:如果把注释掉的那句“//printf("itfd is %d\n", tfd);”去掉注释的话,aaaa。。就打不出来了。。。

高手明白这是咋回事吗??

#include
#include

int main()
{
   int tfd = -1;

   tfd = dup(STDOUT_FILENO);
   //printf("itfd is %d\n", tfd);
   close(STDOUT_FILENO);
   printf("aaaaaaaaaaaaaaaaaa\n");
   dup2(tfd, STDOUT_FILENO);
   close(tfd);

   printf("bbbbbbbbbbbbbbbbbb\n");

   return 0;
}


发信人: ikaikai (Sigh), 信区: LinuxDev
标  题: Re: 一个奇怪的东西,困惑
发信站: 水木社区 (Fri Feb 25 16:17:23 2011), 站内

这个问题很好玩
你理解下面几点就明白了
1. printf是行缓存
2. printf第一次调write的时候会用fstat(1)看1是不是打开的
3. 如果1没打开,缓存保留
4. 第二次以后printf就不检查fstat了

这完全是个printf的实现问题
阅读(2287) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

GFree_Wind2011-03-03 14:04:44

2. printf第一次调write的时候会用fstat(1)看1是不是打开的
3. 如果1没打开,缓存保留
4. 第二次以后printf就不检查fstat了
------------------这3个特性,一直不知道,晚上回家看看源码