類型 | 默認大小[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) |
腳註:linux
- 括號中的數字爲我電腦上的實際大小, 單位爲字節. 測試環境: 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節)
參考資料:socket
- 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. 若有不當之處, 還望指教.函數