Unix I/O
使得所有的輸入和輸出都能以一種統一且一緻的方式來執行;
1.打開檔案 :
标準輸入(描述符為0)、标準輸出(描述符為1)、标準錯誤(描述符為2);
2.改變目前的檔案位置;
3.讀寫檔案
打開和關閉檔案
open函數将filename轉換為一個檔案描述符,并且傳回描述符數字(傳回的檔案描述符總是在程序中目前沒有打開的最小描述符)。
int open(char * filename, int flags, mode_t mode)
flags參數:
- - O_RDONLY:隻讀
- - O_WRONLY:隻寫
- - O_RDWR:可讀可寫
mode參數定義檔案的通路權限位
讀和寫檔案
read (int fd, void *buf, size_t n)(傳回:若成功,則為讀的位元組數,若EOF則為0,若出錯則為-1)
write(int fd, const void *buf, size_t n)(傳回:若成功則為寫的位元組數,若出錯則為-1)
用RIO包健壯的讀寫
無緩沖的輸入輸出函數
rio_readn(int fd, void *usrbuf, size_t n)
rio_writen(int fd, void *usrbuf, size_t n)
傳回:若成功則為傳送的位元組數,若EOF則為0<隻對readn而言>,若出錯則為-1;
帶緩沖的輸入輸出函數
rio_readinitb(rio_t *rp, int fd)
傳回:無
rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen);
rio_readnb(rio_t *rp, void *usrtuf, size_t n);
傳回:若成功則為讀的位元組數,若EOF則為0,若出錯則為-1.
RIO讀程式的核心是rio_read函數。
讀取檔案中繼資料
應用程式通過調用stat和fstat函數,檢索到關于檔案的資訊(中繼資料)。
int stat(const char *fliename, struct stat *buf);
int fstat(int fd, struct stat *buf);
傳回:若成功則為0.若出錯則為-1
共享檔案
描述符表、檔案表、V-node表
I/O重定向
方法一:使用dup2函數
dup2函數拷貝了描述符表表項oldfd到描述符表項newfd,覆寫描述符表項newfd的内容。若果newfd已經打開了,dup2會拷貝oldfd之前關閉newfd.
标準的I/O
标準I/O庫将一個打開的檔案模型化為一個流,一個流就是一個指向FILE類型的結構指針,。stdin\stdout\stdeer分别對應标準輸入、标準輸出、标準錯誤。
extern FLIE *stdin
extern FILE *stdout
extern FILE *stderr
類型為FILE的流是對檔案描述符和流緩沖區的抽象。
我的問題:
1.PS:作業題中有一個傳回未打開的最小描述符為什麼是3?
2.對dup2函數的工作原理不了解。
資料參考來自:《深入了解計算機系統》