标准I/O之实现细节
在UNIX系统中,标准I/O库最终都要调用文件I/O(read、write等)。每个标准I/O流都有一个与其相关联的文件描述符,可以对一个流调用fileno函数以获得其描述符。
注意,fileno不是ISO C标准部分,而是POSIX.1支持的扩展。
#include <stdio.h>
int fileno( FILE *fp );
返回值:与该流相关联的文件描述符
如果要调用dup或fcntl等函数,则需要此函数。
为了了解你所使用的系统中标准I/O库的实现,最好从头文件<stdio.h>开始。从中可以看到:FILE对象是如何定义的、每个流标志的定义以及定义为宏的各个标准I/O例程(例如getc)。
程序清单5-3中的程序为三个标准流以及一个普通文件相关联的流打印有关缓冲的状态信息。
程序清单5-3 对各个标准I/O流打印缓冲状态信息
[root@localhost apue]# cat prog5-.c
#include "apue.h" void pr_stdio( const char *, FILE * ); int
main( void )
{
FILE *fp;
fputs( "enter any character\n", stdout );
if( getchar() == EOF )
err_sys( "getchar error" );
fputs( "one line to standard error\n", stderr ); pr_stdio( "stdin", stdin );
pr_stdio( "stdout", stdout );
pr_stdio( "stderr", stderr ); if(( fp = fopen("/etc/mtab", "r")) == NULL)
err_sys("fopen error");
if(getc(fp) == EOF)
err_sys("getc error");
pr_stdio("/etc/mtab", fp);
exit();
} void
pr_stdio(const char *name, FILE *fp)
{
printf("stream = %s, ", name);
/*
* The following is nonportable.
*/
if(fp->_IO_file_flags & _IO_UNBUFFERED)
printf("unbuffered");
else if(fp->_IO_file_flags & _IO_LINE_BUF)
printf("line buffered");
else /* if neither of above */
printf("fully buffered");
printf(", buffer size = %d\n", fp->_IO_buf_end - fp->_IO_buf_base);
}
注意,在打印缓冲状态信息之前,先对每个流执行I/O操作,第一个I/O操作通常就造成为该流分配缓冲。结构成员_IO_file_flags、_IO_buf_base、_IO_buf_end和常量_IO_UNBUFFERED、_IO_LINE_BUFFERED是由Linux中的GNU标准I/O库定义的。应当了解,其他UNIX系统可能会有不同的标准I/O库实现。
如果运行程序清单5-3中的程序两次,一次使三个标准流与终端相连接,另一次使它们重定向到普通文件,则所得结果是:
[root@localhost apue]# ./prog5- stdin、stdout和stderr都连至终端
enter any character
键入换行符
one line to standard error
stream = stdin, line buffered, buffer size =
stream = stdout, line buffered, buffer size =
stream = stderr, unbuffered, buffer size =
stream = /etc/mtab, fully buffered, buffer size =
[root@localhost apue]# ./prog5- < /etc/termcap > std.out > std.err
三个流都重定向,再次运行该程序
[root@localhost apue]# cat std.err
one line to standard error
[root@localhost apue]# cat std.out
enter any character
stream = stdin, fully buffered, buffer size =
stream = stdout, fully buffered, buffer size =
stream = stderr, unbuffered, buffer size =
stream = /etc/mtab, fully buffered, buffer size =
从中可见,该系统的默认情况是:当标准输入、输出连至终端时,它们是行缓冲的。行缓冲的长度是4096字节。注意,这并没有将输入、输出的行长限制为4096字节,这只是缓冲区的长度。如果要将8192字节的行写到标准输出,则要进行两次write系统调用。当将这两个流重定向到普通文件时,它们就变成是全缓冲的,其缓冲区长度是该文件系统优先选用的I/O长度(从stat结构中得到的st_blksize值)。从中也可看到,标准出错如它所应该的那样是非缓冲的,而普通文件按系统默认是全缓冲的。
本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
标准I/O之实现细节的更多相关文章
- Python 标准库 urllib2 的使用细节
刚好用到,这篇文章写得不错,转过来收藏. 转载自 道可道 | Python 标准库 urllib2 的使用细节 Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节 ...
- 道可叨 | Python 标准库 urllib2 的使用细节
道可叨 | Python 标准库 urllib2 的使用细节 request = urllib2.Request(uri) request.add_header('User-Agent', 'fake ...
- Python 标准库 urllib2 的使用细节[转]
转自[http://zhuoqiang.me/python-urllib2-usage.html] Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比 ...
- Python 标准库 urllib2 的使用细节(转)
http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html http://blog.csdn.net/wklken/article/deta ...
- 转Python 标准库 urllib2 的使用细节
Python 标准库中有很多实用的工具类,但是在具体使用时,标准库文档上对使用细节描述的并不清楚,比如 urllib2 这个 HTTP 客户端库.这里总结了一些 urllib2 库的使用细节. 1 P ...
- 【Python】Python 标准库 urllib2 的使用细节
转自:http://zhuoqiang.me/python-urllib2-usage.html http://www.cnblogs.com/txw1958/archive/2012/03/12/2 ...
- 文件IO函数和标准IO库的区别
摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lsee ...
- 不带缓存的I/O和标准(带缓存的)I/O
首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的 ...
- 标准IO与文件IO 的区别【转】
本文转载自:http://blog.sina.com.cn/s/blog_63f31f3401013jrn.html 先来了解下什么是标准IO以及文件IO. 标准IO:标准I/O是ANSI C建立的一 ...
随机推荐
- Markdown简单语法总结
. 标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 2. 列表 无序列表 * 西瓜 * 葡萄 * 香蕉 - 西瓜 - 葡萄 - ...
- 《BackboneJS框架的技巧及模式》(4)完结篇
<BackboneJS框架的技巧及模式>(4)完结篇 本文紧接第二部分:<BackboneJS框架的技巧及模式(3)> 作者:chszs,转载需注明.博客主页:http://b ...
- 【HDOJ】3909 Sudoku
DLX的应用,基本题,注意maxnode开大点儿. /* 3909 */ #include <iostream> #include <string> #include < ...
- win2003+IIS6+PHP5.3.8+MSSQL2008的安装配置
- bzoj1056
花了一上午大概复习了一下splay,treap 像这种裸的数据结构题在js应该会越来越少 不过练练手也好, 这就是平衡树+hash,如果这是单纯的BST应用,还是写treap吧,好调试 ; ...
- VMwareWorkstation10安装OS_X_Mavericks10.9.2图文详细教程
一.VMware的环境配置... 1.1安装VMware的MAC OS补丁... 1.2建立虚拟机... 二.OS_X_Mavericks的安装及安装驱动... ...
- 【转】VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)
原文网址:http://www.jizhuomi.com/software/189.html 上一节鸡啄米讲了列表框控件ListBox的使用,本节主要讲解组合框控件Combo Box.组合框同样相当常 ...
- Chrome已原生支持“Chrome To Mobile”
完成PC和手机端Chrome的同gmail帐号绑定后,即可按如下操作进行: 已知在版本“19.0.1084.15”中,这个功能默认未开启,需要进入“chrome://flags/”进行手工启用(早几期 ...
- 从零开始学习jQuery (七) jQuery动画-让页面动起来!
一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案, 即使你会使用jQuery也能在阅读中发现些许秘籍. 开发人员一直痛疼做动画. 但是有了jQuery你 ...
- 《转》如何让你的网页加载时间降低到 1s 内
当初分析了定宽高值和定宽高比这两种常见的图片延迟加载场景,也介绍了他们的应对方案,还做了一点技术选型的工作. 经过一段时间的项目实践,在先前方案的基础上又做了很多深入的优化工作.最终将好奇心日报的网页 ...