不帶緩衝的i/o:
首先要明白不帶緩衝的概念:
所謂不帶緩衝,並不是指核心不提供緩衝,而是只單純的系統呼叫,不是函式庫的呼叫
。系統核心對磁碟的讀寫都會提供乙個塊緩衝(在有些地方也被稱為核心快取記憶體),當用write函式對其寫資料時,直接呼叫系統呼叫,將資料寫入到塊緩衝進行排隊,當塊緩衝達到一定的量時,才會把資料寫入磁碟。
因此所謂的不帶緩衝的i/o是指程序不提供緩衝功能(但核心還是提供緩衝的)
。每呼叫一次write或read函式,直接系統呼叫。
而帶緩衝的i/o是指程序對輸入輸出流進行了改進,提供了乙個流緩衝,當用fwrite函式網磁碟寫資料時,先把資料寫入流緩衝區中,當達到一定條件,比如流緩衝區滿了,或重新整理流緩衝,這時候才會把資料一次送往核心提供的塊緩衝,再經塊緩衝寫入磁碟。(雙重緩衝)
因此,帶緩衝的i/o在往磁碟寫入相同的資料量時,會比不帶緩衝的i/o呼叫系統呼叫的次數要少。
linux read()函式:read
函式從開啟的裝置或檔案中讀取資料。
#include
ssize_t read(int fd, void *buf, size_t count);
返回值:成功返回讀取的位元組數,出錯返回-1並設定errno,如果在調read之前已到達檔案末尾,則這次read返回0
引數count
是請求讀取的位元組數,讀上來的資料儲存在緩衝區buf中,同時檔案的當前讀寫位置向後移。
#include "apue.h"
#include
#include
#include
#include
#define buffsize 3
int main(void)
if(n<0)
err_sys("read error");
//exit(0);
return 0;
}問題:read函式在讀的檔案的位元組數小於buffsize時候為啥不出錯,檔案只有兩個位元組返回的為何是3個位元組。為何read中有標準輸入的時候,printf函式就無效了。
stdin_fileno與stdout_fileno阻塞了printf,要這兩個關閉之後才會顯示printf的內容。
read函式會去讀取buffersize數量的檔案內容,直到遇到檔案結尾『\0',會將該檔案結尾讀入。然後下次再讀的時候就返回0。
ynnnnd
*** stack smashing detected ***: ./test terminated
n = 3 n = 3 n = 1 aborted (core dumped)
如果buf的大小小於buffersize也會正常讀寫,只不過會碰到乙個問題,最後會丟擲段錯誤的資訊,也就是棧溢位
posix
表示可移植作業系統介面
(portable operating system inte***ce of unix,縮寫為 posix ),posix標準定義了作業系統應該為應用程式提供的介面標準,是
ieee
為要在各種unix作業系統上執行的軟體而定義的一系列api標準的總稱,其正式稱呼為ieee 1003,而國際標準名稱為iso/iec 9945。
ctrl+d檔案結束符
1 5 輸入輸出初步
c 的輸入 輸出功能由輸入 輸出流 iostream 庫提供。輸入 輸出流庫是c 中乙個物件導向的類層次結構,也是標準庫的一部分。終端輸入,也被稱為標準輸入 standard input 與預定義的iostream物件cin繫結在一起。直接向終端輸出,也被稱為標準輸出,預定義的物件cout繫結在一起...
1 5 輸入輸出初步
c 的輸入 輸出功能由輸入 輸出流 iostream 庫提供。輸入 輸出流庫是c 中乙個物件導向的類層次結構,也是標準庫的一部分。終端輸入,也被稱為標準輸入 standard input 與預定義的iostream物件cin繫結在一起。直接向終端輸出,也被稱為標準輸出,預定義的物件cout繫結在一起...
輸入和輸出
本章內容為coursera課程c 程式設計中第七周的課件的整理 與輸入輸出流操作相關的類 istream是用於輸入的流類,cin就是該類的物件。ostream是用於輸出的流類,cout就是該類的物件。ifstream是用於從檔案讀取資料的類。ofstream是用於向檔案寫入資料的類。iostream...