類型 默認大小[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

  1. 括號中的數字爲我電腦上的實際大小, 單位爲字節. 測試環境: Ubuntu 9.10, 內核版本2.6.31, GNU C library版本2.10.1, 文件系統ext4.
  2. 標準I/O流buffer的默認大小是由具體的C函數庫實現決定的, 好比GNU C library就使用st_blksize做爲默認大小. 每一個流的buffer是在建立好流以後, 第一次調用標準I/O庫函數對流進行操做時經過malloc()函數分配的. (參見《APUE》5.4節與5.12節)
  3. BUFSIZ是定義在<stdio.h>頭文件中的宏.
  4. st_blksize是「struct stat」中的成員, 經過stat(2)函數得到.
  5. _IO_buf_end以及_IO_buf_base是「struct _IO_FILE」中的成員, 「struct _IO_FILE」的定義一般在<libio.h>中. 其實在<stdio.h>中能夠看到「typedef struct _IO_FILE FILE;」, 也就是咱們常用的FILE指針指向的結構體了.
  6. SO_RCVBUF是socket的選項名, 能夠經過getsockopt()函數得到大小, 以及setsockopt()設置大小. 後同. (參見《UNP》2.11節與7.5節)
  7. UDP類型的socket其實是不存在buffer的, 這裏的大小隻是用來約束數據報的最大長度. (參見《UNP》2.11節)

參考資料:socket

  1. W. Richard Stevens and Stephen A. Rago. Advanced Programming in the UNIX Environment, 2/e. Addison-Wesley Professional, June 17, 2005, ISBN 0201433079.
  2. 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.
  3. 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. 若有不當之處, 還望指教.函數