第十章系統級I/O
10.1 Unix I/O
l 所有I/O裝置都被模型化為檔案,所有輸入輸出都被當作對相應檔案的讀和寫。這使得所有的輸入和輸出都能以一種統一且一緻的方式來執行。
n 打開檔案:應用程式需要打開檔案時,核心傳回一個小的非負整數(描述符),每個程序開始時都有三個打開的檔案,标準輸入(描述符0)、标準輸出(描述符1)、标準錯誤(描述符2)
n 改變目前的檔案位置
n 讀寫檔案:end-of-file(EOF)
n 關閉檔案
10.2打開和關閉檔案
l int open(char *filename, int flags, mode_t mode)
- open函數将filename轉換為一個檔案描述符。Flags參數指明了程序打算如何通路檔案。O_RDONLY(隻讀)、O_WRONLY(隻寫)、O_RDWR(可讀可寫)、O_CREAT、O_TRUNC、O_APPEND。mode參數指定了新檔案的通路權限位。
10.3讀和寫檔案
l read函數:傳回值-1表示一個錯誤;傳回值0表示EOF
l write函數:成功傳回寫的位元組數;出錯傳回-1.
l 不足值:讀時遇到EOF;從終端讀文本行;讀和寫的套接字。
10.4用RIO包健壯的讀寫
RIO包會自動處理不足值。
l RIO的無緩沖的輸入輸出函數:在存儲器和檔案之間直接傳送資料。
l RIO的帶緩沖的輸入函數:
n 調用包裝函數(rio_readlineb),它從一個内部緩沖區拷貝一個文本行,當緩沖區變空時,會自動的調用read系統調用來重新填滿緩沖區。在帶緩沖區的版本中,每打開一個描述符都會調用一次rio_readinitb函數,它将描述符fd和位址rp處的一個類型為rio_t的讀緩沖區聯系起來。rio_readinitb函數從檔案rp讀取一個文本行(包括結尾的換行符),将它拷貝到存儲器位置usrbuf,并且用空字元來結束這個文本行。
n RIO讀程式的核心是rio_read函數,rio_read函數可以看成是Unix read函數的帶緩沖區的版本。當調用rio_read要求讀取n個位元組的時候,讀緩沖區内有rp->rio_cnt個未讀的位元組。如果緩沖區為空的時候,就會調用read系統函數去填滿緩沖區。這個read調用收到一個不足值的話并不是一個錯誤,隻不過讀緩沖區的是填充了一部分。一旦緩沖區非空,rio_read就從讀緩沖區拷貝n和rp->rio_cnt中較小值個位元組到使用者緩沖區,并傳回拷貝位元組的數目。
10.5讀取檔案中繼資料
Int stat(const char *filename, struct stat *buf)
Int fstat(int fd ,struct stat *buf)
Stat以檔案名作為輸入,fstat以檔案描述符作為輸入
10.6共享檔案
描述符表 檔案表 v-node表
10.7 I/O重定向
unix>LS>foo.txt
使外殼加載和執行ls程式,将标準輸出定向到磁盤檔案
問題:RIO帶緩沖的輸入,rio_ readlineb函數感覺講的很抽象。
各個系統調用的參數和傳回值彙總
l int open (char *filename, int flags, mode_t mode)
n 傳回:若成功則為新檔案描述符,若出錯則為-1.
n Flags參數指明了程序打算如何通路這個檔案(O_EDONLY、O_WRONLY、O_RDWR、O_CREAT、O_TRUNC、O_APPEND)
n Mode參數指定了新檔案的通路權限位
l int close(int fd)
n 傳回:若成功則為0,若出錯則為-1
l ssize_t read(int fd, void *buf, size_ n)
n 傳回:若成功則為讀的位元組數,若EOF則為0,若出錯為-1
l ssize_t write(int fd, const void *buf, size_t n)
n 傳回:若成功則為寫的位元組數,若出錯則為-1
l ssize_t rio_readn(int fd, void *usrbuf, size_t n)
ssize_t rio_writen(int fd, void *usrbuf, size_t n)
n 傳回i:若成功則為傳遞的位元組數,若EOF則為0(隻對rio_readn而言),若出錯則為-1.
l ssize_t rio_readlineb(rio_t *rp, void *usibuf,size_t maxlen)
ssize_t rio_readnb(rio_t *ro, void *usrbuf, size_t n)
n 傳回:若成功則為讀的位元組數,若EOF則為0,若出錯則為-1.
l int stat(const char *filename, struct stat *buf)
int fstat(int fd ,struct stat *buf)
n 傳回:若成功則傳回iu,若出錯則為-1
n Stat以檔案名作為輸入,fstat以檔案描述符作為輸入