20145227《資訊保安系統設計基礎》第十週學習總結

20145227鄢曼君發表於2016-11-20

20145227《資訊保安系統設計基礎》第十週學習總結

第十章 系統級I/O

附錄A中主要講了這本書中的錯誤處理方式,有一個方法——錯誤處理包裝函式,這個思想很有意思,相當於給基本函式再套上一層皮,然後run這個皮,發現了錯誤就終止,完全正確的話就跟沒有這層皮一樣。

錯誤處理

1.錯誤處理風格

(1)Unix風格

遇到錯誤後返回-1,並且將全域性變數errno設定為指明錯誤原因的錯誤程式碼;

如果成功完成,就返回有用的結果。

(2)Posix風格

返回0表示成功,返回非0表示失敗;

有用的結果在傳進來的函式引數中。

(3)DNS風格

有兩個函式,gethostbyname和gethostbyaddr,失敗時返回NULL指標,並設定全域性變數h_errno。

(4)錯誤報告函式
void unix_error(char *msg) /* unix-style error */
{
    fprintf(stderr, "%s: %s\n", msg, strerror(errno));
    exit(0);
}
/* $end unixerror */

void posix_error(int code, char *msg) /* posix-style error */
{
    fprintf(stderr, "%s: %s\n", msg, strerror(code));
    exit(0);
}

void dns_error(char *msg) /* dns-style error */
{
    fprintf(stderr, "%s: DNS error %d\n", msg, h_errno);
    exit(0);
}

void app_error(char *msg) /* application error */
{
    fprintf(stderr, "%s\n", msg);
    exit(0);
}

2.錯誤處理包裝函式

Unix風格

成功時返回void,返回錯誤時包裝函式列印一條資訊,然後退出。

void Kill(pid_t pid, int signum) 
{
    int rc;

    if ((rc = kill(pid, signum)) < 0)
    unix_error("Kill error");
}
Posix風格

成功時返回void,錯誤返回碼中不會包含有用的結果。

void Pthread_detach(pthread_t tid) {
    int rc;

    if ((rc = pthread_detach(tid)) != 0)
    posix_error(rc, "Pthread_detach error");
}
DNS風格
struct hostent *Gethostbyname(const char *name) 
{
    struct hostent *p;

    if ((p = gethostbyname(name)) == NULL)
    dns_error("Gethostbyname error");
    return p;
}

視訊學習內容總結

ls命令

  • ls功能:讀取檔名和檔案屬性,按照字典序排序後輸出。
  • 常用的命令列選項:
ls -l   以長格式的形式檢視當前目錄下所有可見檔案的詳細屬性
ls -a   列出的內容包含以“.”開頭的檔案
ls -lu  最後訪問時間
ls -s   以塊為單位的檔案大小
ls -t   按時間排序
ls -F   顯示檔案型別

ls -l

  • ls -l 的輸出每行都包含7個欄位
模式              每行的第一個字元表示檔案型別,“-”代表普通檔案,“d”代表目錄檔案。
連結數            指該檔案被引用的次數
檔案所有者        指出檔案所有者的使用者名稱
組                指出檔案所有者所在的組
大小              顯示檔案的位元組數
最後修改時間      檔案的最後修改時間
檔名            檔名
  • ls -l可以顯示當前目錄下目錄或檔案的詳細屬性資訊

20145227《資訊保安系統設計基礎》第十週學習總結

實踐

首先把老師的壓縮包在虛擬機器中解壓縮,執行每個程式碼

20145227《資訊保安系統設計基礎》第十週學習總結

cp

  • 檢視幫助文件man cp

20145227《資訊保安系統設計基礎》第十週學習總結

  • cp的作用就是讀取一個檔案的內容到儲存器,在新的地址建立空白檔案,再從儲存器將內容寫入新檔案。(如下圖把ls1.c複製,存為lc.c檔案)

20145227《資訊保安系統設計基礎》第十週學習總結

ls1和ls2

  • ls1程式的作用是在當前目錄顯示檔名(未帶引數直接顯示,帶引數的存入argc)

20145227《資訊保安系統設計基礎》第十週學習總結

  • ls2不僅顯示了檔名,還用來顯示檔案的詳細資訊,比如使用者名稱、群組名、大小、建立時間、讀寫許可權等。

20145227《資訊保安系統設計基礎》第十週學習總結

echostate.c和setecho.c

echostate.c
  • 功能:檢視在命令列中輸入命令時是否可見,可見返回1,否則返回0

20145227《資訊保安系統設計基礎》第十週學習總結

setecho.c
  • 設定回顯位的狀態,命令列引數為y則開啟,否則關閉。
  • 標準輸入的檔案描述符為0.
  • 使用tcgetattr()函式和termios結構體可獲得標準輸入的屬性。
  • 使用tcsetattr()函式和termios結構體可以將更改後的屬性設定重新寫回標準輸入。

ioctl函式

  • ioctl是裝置驅動程式中對裝置的I/O通道進行管理的函式。
  • ioctl函式是檔案結構中的一個屬性分量,就是說如果你的驅動程式提供了對ioctl的支援,使用者就可以在使用者程式中使用ioctl函式控制裝置的I/O通道。
  • 檢視幫助文件man isatty man ioctl
  • isatty:判斷一個檔案描述符是否指向一個終端

20145227《資訊保安系統設計基礎》第十週學習總結

  • ioctl:控制驅動器

20145227《資訊保安系統設計基礎》第十週學習總結

  • 程式執行結果

20145227《資訊保安系統設計基礎》第十週學習總結

filesize

  • filesize程式碼用st_size成員來計算檔案的位元組數大小,gcc後有一個警告,呼叫正常。

20145227《資訊保安系統設計基礎》第十週學習總結

fileinfo

  • fileinfo程式碼這個功能用來實現顯示檔案資訊,建立了一個stat資料結構。先判斷命令是否有運算元,有的話才能繼續進行下去,如果沒有報錯就列印出來相關檔案資訊,報錯就用perror將報錯資訊列印出來。

20145227《資訊保安系統設計基礎》第十週學習總結

spwd命令

  • spwd的功能是列出當前目錄。

20145227《資訊保安系統設計基礎》第十週學習總結

who命令

  • 這個程式碼的思想是,從UTMP_FILE檔案中讀取想要的資訊到儲存器中,然後再用標準輸出函式列印到螢幕上,最後關閉檔案。
  • 程式執行結果

20145227《資訊保安系統設計基礎》第十週學習總結

本週程式碼託管連結

https://git.oschina.net/20145227/IS-Design-20145227/tree/master/ch10

20145227《資訊保安系統設計基礎》第十週學習總結

本週程式碼總數

20145227《資訊保安系統設計基礎》第十週學習總結

學習進度條

程式碼行數(新增/累積) 部落格量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 0 2/2 20/20
第二週 100/100 1/3 20/40
第三週 200/300 1/4 22/62
第五週 200/500 1/5 22/84
第六週 274/774 1/6 22/106
第七週 127/901 2/8 22/128
第八週 50/951 2/10 22/150
第九周 418/1369 2/12 22/172
第十週 485/1854 2/14 22/194

參考資料

相關文章