原文发表于「桃源」: http://linux.cuit.edu.cn/?p=919
类型 | 默认大小[1] | 存储位置 | 操作函数 | 备注 | |
---|---|---|---|---|---|
标准I/O流[2] | File | BUFSIZ [3] (8192) 或者 st_blksize [4] (4096) |
User Space | stat (2), setvbuf() , fflush() |
每一个标准I/O流都有一个buffer |
stdin |
stdin->_IO_buf_end [5] - stdin->_IO_buf_base (1024) |
||||
stdout |
stdout->_IO_buf_end - stdout->_IO_buf_base (1024) |
||||
stderr |
1 | ||||
TCP | Receive Buffer | SO_RCVBUF [6] (87380) |
Kernel Space | getsockopt() , setsockopt() |
每一个socket都有两个buffer |
Send Buffer | SO_SNDBUF (16384) |
||||
UDP[7] | Receive Buffer | SO_RCVBUF (114688) |
|||
Send Buffer | SO_SNDBUF (114688) |
脚注:
- 括号中的数字为我电脑上的实际大小, 单位为字节. 测试环境: Ubuntu 9.10, 内核版本2.6.31, GNU C library版本2.10.1, 文件系统ext4.
- 标准I/O流buffer的默认大小是由具体的C函数库实现决定的, 比如GNU C library就使用
st_blksize
作为默认大小. 每个流的buffer是在创建好流之后, 第一次调用标准I/O库函数对流进行操作时通过malloc()
函数分配的. (参见《APUE》5.4节与5.12节) BUFSIZ
是定义在<stdio.h>
头文件中的宏.st_blksize
是"struct stat
"中的成员, 通过stat
(2)函数获得._IO_buf_end
以及_IO_buf_base
是"struct _IO_FILE
"中的成员, "struct _IO_FILE
"的定义通常在<libio.h>
中. 其实在<stdio.h>
中可以看到"typedef struct _IO_FILE FILE;
", 也就是我们经常使用的FILE
指针指向的结构体了.SO_RCVBUF
是socket的选项名, 可以通过getsockopt()
函数获得大小, 以及setsockopt()
设置大小. 后同. (参见《UNP》2.11节与7.5节)- UDP类型的socket实际上是不存在buffer的, 这里的大小只是用来约束数据报的最大长度. (参见《UNP》2.11节)
参考资料:
- W. Richard Stevens and Stephen A. Rago. Advanced Programming in the UNIX Environment, 2/e. Addison-Wesley Professional, June 17, 2005, ISBN 0201433079.
- W. Richard Stevens, Bill Fenner, and Andrew M. Rudoff. UNIX Network Programming, Volume 1: The Sockets Networking API, 3/e. Addison-Wesley Professional, November 21, 2003, ISBN 0131411551.
- Helali Bhuiyan, Mark McGinley, Tao Li and Malathi Veeraraghavan. TCP Implementation in Linux: A Brief Tutorial. Available online from http://www.ece.virginia.edu/mv/research/DOE09/publications/TCPlinux.pdf
P.S. 如有不当之处, 还望指教.
No comments:
Post a Comment