這里的緩沖是指的是用戶空間的I/O緩沖區,不是內核緩沖。
無緩沖:用戶層不提供緩沖,數據流直接到內核緩沖,再到磁盤等外設上。標準錯誤輸出(2)通常是無緩存的,因為它必須盡快輸出,且是輸出到具有交互式的設備上,如屏幕,不是磁盤。
行緩沖:在I/O緩沖區中遇到換行符或者緩沖區寫滿時,就自動把數據送到內核緩沖區標準輸入(0)和標準輸出(1)對應終端設備時通常是行緩沖的。另外,在程序結束時;main函數中return時(代表程序執行結束);main函數調用exit函數時(結束當前進程);C庫函數fflush時或關閉文件時,也會將I/O緩沖的數據刷到內核中,然后送到外設上。
全緩沖:如果緩沖區寫滿了就寫回內核。常規文件的寫入寫出(磁盤)通常是全緩沖的。另外,在程序結束時;main函數中return時(代表程序執行結束);main函數調用exit函數時(結束當前進程);C庫函數fflush時或關閉文件時,也會將I/O緩沖的數據刷到內核中,然后送到外設上。后兩種都是:數據-------I/O緩沖---------內核緩沖-------外設。
上述都是I/O緩沖區,其作用是減少read和write的次數,即減少了系統調用,從而減少了系統開銷,提高了I/O速度。
內核緩沖區。?從理論上講,內核可以在任何時候寫磁盤,但并不是所有的write操作都會導致內核的寫動作。內核會把要寫的數據暫時存在緩沖區中,積累到一定數量后再一次寫入。有時會導致意外情況,比如斷電,內核還來不及把內核緩沖區中的數據寫道磁盤上,這些更新的數據就會丟失。
read把數據從內核緩沖區復制到I/O緩沖區,write把數據從I/O緩沖區復制到內核緩沖區,它們不等價于數據在內核緩沖區和磁盤之間的交換。注意:對于用戶進程來說,把數據送到內核緩沖和送到外設上是等價的(一樣的效果),即對用戶進程是透明的。
標準輸出(1)和錯誤輸出(2)的區別。首先,前者是行緩沖,后者是無緩沖,可以立即將錯誤信息輸出到屏幕上,而不會留在I/O緩沖中;兩者都默認輸出到屏幕上。