- 论坛徽章:
- 0
|
原帖由 zhuhefang2006 于 2009-2-6 18:40 发表
当STDOUT_FILENO被重定向到fd[1]以后,变成了全缓冲模式
所以 printf("this will not appear STDOUT_FILENO\n");里的“this will not appear STDOUT_FILENO\n”将会保存至缓冲区中
后来STDOUT_FILENO被恢复到 ...
差不多吧,但不完全准确,开始时"this will not appear STDOUT_FILENO"没打印出来确实是因为全缓存,但之后它打印出来并不是因为
dup2(fdcopy, STDOUT_FILENO)使stdout恢复成行缓存,它这时还是全缓存,包括下一句"write to STDOUT_FILENO"都还是保存在C库的缓存中,最后显示出来是因为进程退出时C库才进行的刷新,你可以在return前加一条sleep(x)验证一下。
我没有读glibc的源码,但根据strace分析了一下,似乎glibc只是在第一次printf时去检查stdout的类型,并且之后就认为stdout是这个类型了。由于你第一次在调用printf时,stdout已经被重定向到了管道,因此glibc就认为stdout是管道了,因此之后都进行全缓存。如果你在第一次dup2(STDOUT_FILENO, fdcopy)前就先printf一下,那么glibc就会认为stdout是终端而进行行缓存了,之后还是那些代码打印出来的结果就会完全不同。
以上仅是我根据strace的推测,希望了解glibc代码的兄弟确认一下。 |
|