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
可以顯示當前目錄下目錄或檔案的詳細屬性資訊
實踐
首先把老師的壓縮包在虛擬機器中解壓縮,執行每個程式碼
cp
- 檢視幫助文件
man cp
- cp的作用就是讀取一個檔案的內容到儲存器,在新的地址建立空白檔案,再從儲存器將內容寫入新檔案。(如下圖把ls1.c複製,存為lc.c檔案)
ls1和ls2
- ls1程式的作用是在當前目錄顯示檔名(未帶引數直接顯示,帶引數的存入argc)
- ls2不僅顯示了檔名,還用來顯示檔案的詳細資訊,比如使用者名稱、群組名、大小、建立時間、讀寫許可權等。
echostate.c和setecho.c
echostate.c
- 功能:檢視在命令列中輸入命令時是否可見,可見返回1,否則返回0
setecho.c
- 設定回顯位的狀態,命令列引數為y則開啟,否則關閉。
- 標準輸入的檔案描述符為0.
- 使用tcgetattr()函式和termios結構體可獲得標準輸入的屬性。
- 使用tcsetattr()函式和termios結構體可以將更改後的屬性設定重新寫回標準輸入。
ioctl函式
- ioctl是裝置驅動程式中對裝置的I/O通道進行管理的函式。
- ioctl函式是檔案結構中的一個屬性分量,就是說如果你的驅動程式提供了對ioctl的支援,使用者就可以在使用者程式中使用ioctl函式控制裝置的I/O通道。
- 檢視幫助文件
man isatty
man ioctl
- isatty:判斷一個檔案描述符是否指向一個終端
- ioctl:控制驅動器
- 程式執行結果
filesize
- filesize程式碼用st_size成員來計算檔案的位元組數大小,gcc後有一個警告,呼叫正常。
fileinfo
- fileinfo程式碼這個功能用來實現顯示檔案資訊,建立了一個stat資料結構。先判斷命令是否有運算元,有的話才能繼續進行下去,如果沒有報錯就列印出來相關檔案資訊,報錯就用perror將報錯資訊列印出來。
spwd命令
- spwd的功能是列出當前目錄。
who命令
- 這個程式碼的思想是,從UTMP_FILE檔案中讀取想要的資訊到儲存器中,然後再用標準輸出函式列印到螢幕上,最後關閉檔案。
- 程式執行結果
本週程式碼託管連結
https://git.oschina.net/20145227/IS-Design-20145227/tree/master/ch10
本週程式碼總數
學習進度條
程式碼行數(新增/累積) | 部落格量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 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 |