天天看點

資訊安全系統設計基礎第九周學習總結

Unix I/O

使得所有的輸入和輸出都能以一種統一且一緻的方式來執行;

1.打開檔案 :

标準輸入(描述符為0)、标準輸出(描述符為1)、标準錯誤(描述符為2);

2.改變目前的檔案位置;

3.讀寫檔案

打開和關閉檔案

open函數将filename轉換為一個檔案描述符,并且傳回描述符數字(傳回的檔案描述符總是在程序中目前沒有打開的最小描述符)。

int open(char * filename, int flags, mode_t mode)

flags參數:

  1. - O_RDONLY:隻讀
  2. - O_WRONLY:隻寫
  3. - 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函數的工作原理不了解。

資料參考來自:《深入了解計算機系統》