http://cpp.ezbty.org/import_doc/linux_manpage/setvbuf.3.html
SETBUF
章节:Linux 程序员手册 (3)
更新:2008-06-26
到 易美翻译 翻译 本页
名字
setbuf, setbuffer, setlinebuf, setvbuf - 流缓存区操作
概要
#include <stdio.h> void setbuf(FILE *stream, char *buf); void setbuffer(FILE *stream, char *buf, size_t size); void setlinebuf(FILE *stream); int setvbuf(FILE *stream, char *buf, int mode, size_t size);
glibc 需要特性测试宏(参看 feature_test_macros(7)):
setbuffer(), setlinebuf():_BSD_SOURCE
描述
有三种缓存类型存在,不缓存,块缓存,和行缓存。当一个输出流是不缓存的,信息将在写入的同时在目标文件或终端显示;当它是块缓存,多个字符被缓存然后作为整体一块写入;当是行缓存,对输出流而言所有的数据都会被缓存直到遇到一个换行符,或者对于一个绑定到终端设置的输入流(典型地 stdin)所有数据也会缓存直到读到一个换行符。首次对文件进行 I/O 操作时,malloc(3) 被调用,并用于获得一个缓存区。如果一个流引用一个终端(就像 stdout 通常那样),则它是行缓存的。标准错误流 stderr 总是默认不缓存的。
setvbuf() 函数可能用于任何已经打开的流以更改它的缓存区。mode 参数必须是下面三个宏之一:
-
-
_IONBF
- 不缓存 _IOLBF
- 行缓存 _IOFBF
- 全缓存
除了是不存在的文件外,buf 参考应该指向一个至少有 size 个字节长度的缓存区;这个缓存将代替当前的缓存区。如果参数 buf 是 NULL,只要模式支持;一个新缓存区将用于下次读写操作。setvbuf() 函数只应该在刚打开一个流之后和执行任何其它操作之前使用。
其它三个调用,在功能上,只是 setvbuf() 调用的一个别名。setbuf() 函数事实上等价于调用
setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
setbuffer() 函数也是相同的,只不过缓存区的大小是调用者提供的,而不是通过 BUFSIZ 来检测的。setlinebuf() 函数事实上等价于调用:
setvbuf(stream, (char *) NULL, _IOLBF, 0);
返回值
函数 setvbuf() 成功时返回 0。失败时它返回非零值(mode 无效或请求无法完成)。在失败时它设置 errno。
其它函数没有返回值。
遵循于
setbuf() 和 setvbuf() 函数遵循于 C89 和 C99。
错误
setbuffer() 和 setlinebuf() 函数不能移植到 BSD 版本在 4.2BSD 之前,同时在 Linux 下它们从 libc 4.5.21 开始有效。在 4.2BSD 和 4.3BSD 系统里,setbuf() 使用一个不理想的缓存区尺寸并应该避免。
你必须保证 buf 指定的空间一直到 stream 关闭时都有效,这包括在退出时也一样。例如,下面的代码是无效的:
#include <stdio.h> int main(void) { char buf[BUFSIZ]; setbuf(stdin, buf); printf("Hello, world!\n"); return 0; }