1. 程式人生 > >2018-2019-1 20165330 《資訊安全系統設計基礎》第六週學習總結

2018-2019-1 20165330 《資訊安全系統設計基礎》第六週學習總結

學習目標

  • 瞭解系統呼叫及錯誤處理方法
  • 理解IO處理及檔案系統
  • 掌握Unix/Linux系統級I/O:open close read write seek stat
  • 掌握I/O重定向的方法

學習內容

Linux I/O
  1. Linux I/O:將裝置優雅地對映為檔案的方式,允許Linux核心引出一個簡單、低階的應用介面
  2. 輸入輸出執行方式:
    • 開啟檔案
      • 描述符:核心開啟檔案時返回的一個小的非負整數
    • 每個程序開始均有三個開啟的檔案
      • 標準輸入(描述符為0)
      • 標準輸出(描述符為1)
      • 標準錯誤(描述符為2)
    • 改變當前的檔案位置
    • 讀寫檔案
    • 關閉檔案
  3. 檔案
    • 型別:普通檔案、目錄、套接字
      • 目錄層次:image
    • 開啟和關閉檔案
      • 呼叫open函式開啟一個已存在的檔案或建立一個新檔案
       int open(char *filename,int flags,mode_t mode);
      • flags引數指明開啟檔案方式:
        • O_RDONLY:只讀
        • O_WRONLY:只寫
        • O_RDWR:可讀可寫
      • flags引數提供額外提示:
        • O_CREAT:檔案不存在,建立一個截斷(空)檔案
        • O_TRUNC:檔案已存在就截斷它
        • O_APPEND:在每次寫操作前,設定檔案位置到檔案的結尾處
      • 關閉檔案:
        int close(fd);
    • 讀和寫檔案
      • 呼叫readwrite函式執行輸入輸出
       size_t read(int fd,void *buf,size_t n);
       ssize_t write(int fd,void *buf,size_t n);
RIO包
  1. 無緩衝的輸入輸出函式

     #include "csapp.h"
     ssize_t rio_readn(int fd,void *usrbuf,size_t n);
     ssize_t rio_writen(int fd,void *usrbuf,size_t n);
  2. 帶緩衝的輸入函式

     #include "csapp.h"
     void rio_readinitb(rio_t *rp,int fd);
     ssize_t rio_readlineb(rio_t *rp,void *usrbuf,size_t maxlen);
     ssize_t rio_readnb(rio_t *rp,void *usrbuf,size_t n);
  3. 讀取檔案元資料
  • 呼叫statfstat函式檢索檔案的資訊(元資料)
    #include <unistd.h> #include <sys/stat.h> int stat(const char *filename,struct stat *buf); int fstat(int fd,struct stat *buf);
  1. 讀取目錄內容
  • 返回目錄流的指標
    #include <dirent.h> #include <sys/stat.h> DIR *opendir(const char *name);
  • 返回流dirp中下一目錄項的指標
    #include <dirent.h> struct dirent *readdir(DIR *dirp);
  • 關閉流並釋放所有資源
    #include <dirent.h> int closedir(DIR *dirp);
I/O重定向
  1. Linux shell提供了I/O重定向操作符,允許使用者將磁碟檔案和標準輸入輸出聯絡起來
  2. 重定向到磁碟檔案foo.txtlinux> ls > foo.txt
  3. I/O重定向使用dup2函式工作

    #include <unistd.h>
    int dup2(int oldfd,int newfd);

    image

兩個重要命令
  1. man -k key1 | grep key2| grep 2:根據關鍵字檢索系統呼叫
    • Linux系統提供了相對比較豐富的幫助手冊(man),man是manual的縮寫,在日常linux系統管理中經常用到
    • 在Ubuntu下可通過man deluser檢視相關幫助文件
    • man -k:根據關鍵字搜尋聯機幫助,是一種模糊搜尋
    • man -f:關鍵字精確搜尋,與-k不同,它只搜尋與關鍵字完全匹配的幫助頁
    • man -a:搜尋並開啟所有man中同名幫助
    • man -aw:顯示所有手冊檔案的路徑
  2. grep -nr XXX /usr/include:查詢巨集定義,型別定義
    • grep -nr:這條語句可以用來查詢關鍵字,全文搜尋,並且可以直接查詢檔案內的內容
    • 查詢巨集 STDOUTFILENO 的值:grep -nr STDOUTFILENO /usr/include
    • 查詢當前目錄下.cmain函式在那個檔案中:grep main .c
    • grep [options]:過濾/搜尋特定字元
    • [options]主要引數:
      • -a:不要忽略二進位制的資料
      • -A<顯示列數>:除了顯示符合範本樣式的那一列之外,並顯示該列之後的內容
      • -b:在顯示符合範本樣式的那一列之前,標示出該列第一個字元的位編號
      • -B<顯示列數>:除了顯示符合範本樣式的那一列之外,並顯示該列之前的內容
      • -c:計算符合範本樣式的列數。
      • -V:顯示版本資訊
      • -q:不顯示任何資訊

ch06課下測試錯題總結

  • 有關磁碟操作,說法正確的是()

A .
對磁碟扇區的訪問時間包括三個部分中,傳送時間最小。

B .
磁碟以位元組為單位讀寫資料

C .
磁碟以扇區為單位讀寫資料

D .
讀寫頭總處於同一柱面

正確答案:A C D 書P409

  • 有關RAM的說法,正確的是()

A .
SRAM和DRAM掉電後均無法儲存裡面的內容。

B .
DRAM將一個bit存在一個雙穩態的儲存單元中

C .
一般來說,SRAM比DRAM快

D .
SRAM常用來作快取記憶體

E .
DRAM將每一個bit儲存為對一個電容充電

F .
SRAM需要不斷重新整理

G .
DRAM被組織為二維陣列而不是線性陣列

正確答案: A C D E G 書P400