20145301 《信息安全系統設計基礎》第9周學習總結

20145301 《信息安全系統設計基礎》第9周學習總結

教材學習內容總結

第十章-系統級I/O

10.1 Unix I/O
  • I/O設備:網絡、磁盤和終端
  • Unix I/O :將設備映射爲文件的方式,容許Unix內核引出一個簡單、低級的應用接口。
  • 描述符:打開文件時,內核返回一個小的非負整數。
  • Unix外殼建立的每一個進程開始時都有三個打開的文件:標準輸入(描述符爲0)、標準輸出(描述符爲1)、標準錯誤(描述符爲2)。
  • 改變當前的文件位置:文件位置爲k,初始爲0。
  • seek操做:顯式地設置文件的當前位置爲k.
  • EOF:END OF FILE,是一個條件
10.2 打開和關閉文件
  • open函數:打開一個已存在的文件或者建立一個新文件  
    #include <sys/types.h>  
    #include <sys/stat.h>  
    #include <fcntl.h>  
    int open(char *filename,int flags,mode_t mode);
  • open函數將filename轉換爲一個文件描述符,而且返回描述符數字。 返回的描述符老是在進程中當前沒有打開的最小描述符。
  • filename:文件名html

  • flags:指明進程打算如何訪問這個文件,node

    • O_ RDONLY :只讀
    • O_ WRONLY :只寫
    • O_ RDWR :可讀可寫
    • O_CREAT:文件不存在,就建立新文件
    • O_TRUNC:若是文件存在,就截斷它
    • O_APPEND:寫操做前設置文件位置到結尾處
  • flag參數能夠是一個或多個更多位掩碼的或。
    • O_ CREAT:若是文件不存在,就建立它的一個截斷的空文件
    • O_ TRUNC:若是文件已經存在,就截斷它
    • O_ APPEND:在每次寫操做前,設置文件位置到文件的結尾處。
  • mode參數指定了新文件的訪問權限位。文件的訪問權限位被設置爲mode & ~umask
10.3 讀和寫文件
  • 應用程序是經過分別調用read和write函數來執行輸入和輸出的。  
    #include <unistd.h>  
    ssize_t read(int fd,void buf,size_t n);  
    ssize_t write(int fd,const void 
    buf,size_t n);
  • read函數:從描述符爲fd的當前文件位置拷貝最多n個字節到存儲器位置buf。 返回值:-1:一個錯誤;0:EOF;不然,返回值:實際傳送的字節數量。git

  • write函數:從存儲器位置buf拷貝至多n個字節到描述符fd的當前文件位置。vim

  • lseek函數:應用程序可以顯式地修改當前文件的位置。緩存

  • 不足值:read和write傳送的字節比應用程序要求的少。安全

  • 產生不足值的緣由:  
    一、讀時遇到EOF  
    二、從終端讀文本行  
    三、讀和寫網絡套接字網絡

    10.4 用RIO包健壯地讀寫
  • RIO包的實質:I/O包數據結構

  • RIO包提供的兩種函數:無緩衝的輸入輸出函數、帶緩衝的輸入函數(線程安全)app

  • RIO的帶緩衝的輸入函數函數

一個文本行就是一個有換行符結尾的ASCII碼字符序列。 在Unix系統中,換行符(‘\n’)與ASCII碼換行符(LF)相同,數字值爲0x0a。

10.5 讀取文件元數據
  • 檢索文件信息(元數據):應用程序可以經過調用stat和fstat函數

  • stat函數以一個文件名做爲輸入,填寫一個stat數據結構中的各個成員。

  • fstat函數以文件描述符而不是文件名做爲輸入。

  • st_ size成員包含了文件的字節數大小。

  • st_ mode成員則編碼了文件訪問許可位和文件類型。

  • 文件類型包括:

    • 普通文件:某種類型的二進制或文本數據。
    • 文件:關於其餘文件的信息。
    • 套接字:一種用來經過網絡與其餘進程通訊的文件。
    • 宏指令:根據st_mode成員來肯定文件的類型。
  • 在sys/stat.h中定義:

    • S_ ISREG():這是一個普通文件嗎?
    • S_ ISDIR():這是一個目錄文件嗎?
    • S_ ISSOCK():這是一個網絡套接字嗎?
10.6 共享文件
  • 內核使用三個相關的數據結構來表示打開的文件:

    • 描述符表:每一個進程都有它獨立的描述符表。 每一個打開的描述符表項指向文件表中的一個表項。
      • 文件表:全部進程共享這張表。每一個文件表的表項組成包括有當前的文件位置、引用計數、以及一個指向v-node表中對應表項的指針。 直到引用計數爲0,內核纔會刪除該文件表表項。
    • v-node表:全部進程共享這張v-node表。
  • 在內核刪除相應文件表項以前,父子進程必須都關閉了它們的描述符。

10.7 I/O重定向
  • Unix外殼提供了I/O重定向操做符,容許用戶將磁盤文件和標準輸入輸出聯繫起來。

unix> ls > foo.txt

  • I/O重定向是依靠dup2函數工做的。 #include <unistd.h>  
    int dup2(int oldfd,int newfd);
  • dup2函數拷貝描述符表表項oldfd到描述符表表項newfd,覆蓋描述符表表項newfd之前的內容。若newfd已經打卡了。dup2會在拷貝oldfd以前關閉newfd。
10.8 標準I/O
  • 標準I/O庫將一個打開的文件模型化爲一個流,一個流就是一個指向FILE類型的結構的指針。每一個ANSIC程序開始都有三個打開的流stdin、stdout和stderr,分別對應於標準輸入、標準輸出、標準錯誤。

  • 類型爲FILE的流是對文件描述符和流緩衝區的抽象。流緩衝區的目的和RIO讀緩衝區的同樣,就是開銷較高的Unix I/O系統調用的數量儘可能能的小。

10.9 I/O函數的使用
  • 應用程序能夠經過open、close、lseek、read、write和stat這樣的函數來訪問Unix I/O。

  • RIO函數:read和write的健壯的包裝函數,自動處理不足值,爲讀文本行提供一種高效的帶緩衝的方法。

  • 標準I/O函數:提供了Unix I/O函數的一個更加完整的帶緩衝的替代品,包括格式化的I/O例程。是磁盤和終端設備I/O之選。
  • 套接字描述符:Unix對網絡的抽象是一種稱爲套接字的文件類型,被稱爲套接字描述符。應用進程經過讀寫套接字描述符來與運行在其餘計算機上的進程通訊。

  • 對流I/O限制是:

    • 跟在輸出函數以後的輸入函數,必須在其中間插入fflush、fseek、fsetpos或者rewind函數,後三個函數使用Unix I/O中的lseek函數來重置當前的文件位置。

    • 跟在輸入函數以後的輸出函數,必須在中間插入fseek、fsetpos或者rewind的調用,一個輸出函數不能跟隨在一個輸入函數以後,除非該輸入函數遇到了一個EOF。

  • 解決對流I/O限制的方法是:  
    採用在每一個輸入操做前刷新緩存區這樣的規則來知足。 對同一個打開的套接字描述符打開兩個流,一個用來讀,一個用來寫。

教材學習中的問題和解決過程

  • 10.1 編譯時發現缺失「csapp.h」的一系列頭文件,經過在CSDN.NET上找到了csapp.h和csapp.c,在網上下載,最終獲得了正確答案:  
    fd2=3

課後做業

  • 10.1

    • Unix進程生命週期開始時,打開的描述符賦給了stdin(描述符0)、stdout(描述符1)和stderr(描述符2)。由於fd1已經關閉,所以程序的輸出是「fd2=3」。
  • 10.2

    • 描述符fd1和fd2都要各自的打開文件表表項,因此每一個描述符對於foobar.txt都有它本身的位置。所以,從fd2的讀操做會讀取foobar.txt的第一個本身,並輸出c=f ,而不是 c=o
  • 10.3

    • 子進程繼承父進程的描述符表,以及全部進程共享的同一個打開文件表。描述符fd在父子進程中都指向同一個打開文件表表項。當子進程讀取文件的一個字節時,文件位置加1.因此,父進程會讀取第二個字節,而輸出就是 c=o,而不是10.2中的 c=f
  • 10.4

    • 重定向標準輸入(描述符0)到描述符5,直接調用dup2(5,0)
  • 10.5

    • fd1重定向到了fd2,輸出應該爲c=o

本週代碼託管截圖

學習進度條

  代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標  4000行  24篇  400小時   
第一週  150/150  1/1  15/15  對Linux有了初步的認識
第二週  200/350 1/2 20/35 vim的使用 
第三週  250/600 1/4 20/55 各類信息的表示方法
第五週  250/850 1/5 25/80 彙編與反彙編
第六週  150/1000 1/6 25/105 Y86
第七週  74/1074 1/7 25/130 各種存儲器
第八週  0/1074  2/9 20/150 錯題總結
第九周  109/1183 2/11 25/175 系統級I/O

參考資料

相關文章
相關標籤/搜索