信息安全系统设计基础第九周总结
第十章 系統級I/O
輸入操作是從I/O設備拷貝數據到主存,輸出操作是從主存拷貝數據到I/O設備
10.1Unix I/O
一個Unix文件就是一個m個字節的序列:
所有的I/O設備都被模型化為文件,所有的輸入和輸出都被當作對相應文件的讀和寫來執行.這種將設備影射為文件的方式,稱為Unix I/O
- 打開文件
- 改變當前文件位置
- 讀寫文件
- 關閉文件
10.2打開和關閉文件
進程是通過調用open函數來打開一個已存在的文件或者創建一個新文件的
flags參數指明了進程打算如何訪問這個文件:
- O_RDONLY:只讀
- O_WRONLY:只寫
- O_RDWR:可讀可寫
flags參數也可以是一個或者更多位掩碼的或,為寫提供給一些額外的指示:
- O_CREAT:如果文件不存在,就創建他的一個截斷的(空)文件
- O_TRUNC:如果文件已存在,就截斷他
- O_APPEND:在每次寫操作前,設置文件位置到文件的結尾處
進程通過調用close函數關閉一個打開的文件
10.3讀和寫文件
應用程序是通過分別調用read和write函數來執行輸入和輸出的
read函數從描述符為fd的當前文件位置拷貝最多n個字節到存儲器位置buf。返回值-1表示一個錯誤,而返回值0表示EOF。否則,返回值表示的是實際傳送的字節數量
write函數從存儲器位置buf拷貝最多n個字節到描述符fd的當前文件位置。下圖展示了一個程序使用read和write調用一次一個字節的從標準輸入拷貝到標準輸出
在某些情況下,read和write傳送的字節比應用程序要求的要少。這些不足置不表示有錯誤,出現這種情況的原因如下:
- 讀時遇到EOF
- 從終端讀文本行
- 讀和寫網絡套接字
10.4用RIO包健壯的讀寫
RIO提供了兩類不同的函數:
- 無緩沖的輸入輸出函數
- 帶緩沖的輸入函數
無緩沖的輸入輸出函數:通過調用rio-readn和rio-writen函數,應用程序可以在存儲器和文件之間直接傳送數據
10.5讀取文件元數據
應用程序能夠通過調用stat和fstat函數,檢索到關于文件的信息(元數據)
st-size成員包含了文件的字節數大小。st-mode成員則編碼了文件訪問許可位和文件類型
Unix識別大量不同的文件類型
- 普通文件:二進制或文本數據
- 目錄文件:其他文件的信息
Unix提供的宏指令根據st-mode成員來確定文件的類型
10.6共享文件
可以用許多不同的方式來共享Unix文件
內核用三個相關的數據結構來表示打開的文件:
- 描述符表
- 文件表
- v-node表
10.7I/O重定向
Unix外殼提供了I/O重定向操作符,允許用戶將磁盤文件和標準輸入輸出聯系起來
I/O重定向一種方式是使用dup2函數工作
附錄A 錯誤處理
錯誤處理包裝函數:給定某個基本的系統級函數佛foo,給定一個有相同參數,只不過開頭字母大寫了的包裝函數Foo.包裝函數調用基本函數并檢查錯誤.如果包裝函數發現了錯誤那么它就打印一條信息并終止進程.否則,他返回到調用者
A.1Unix系統中的錯誤處理
系統級函數調用使用三種不同風格的返回錯誤:Unix風格,Posix風格,DNS風格
? ? ?1.Unix風格的錯誤處理
? ? ? ? Unix早期開發出來的函數的函數返回值既包括錯誤代碼,也包括有用的結果
? ? ? ? Unix風格的錯誤處理代碼通常具有以下形式:
? ? ? ? strerror函數返回某個errno值的文本描述
? ? ?2.Posix風格的錯誤處理
? ? ? ? 只用返回值來表明成功(0)或者失敗(非0),任何有用的結果都返回在通過引用傳遞進來的函數參數中
? ? ? ? Posix風格的錯誤處理代碼通常具有以下形式:
? ? ?3.DNS風格的錯誤處理
? ? ? ? 在失敗時返回NULL指針,并設置全局變量h_errno
? ? ? ? DNS風格的錯誤處理代碼通常具有以下形式:
? ? ?4.錯誤報告函數小結
? ? ? ? 使用下列錯誤報告函數來包容不同的錯誤處理風格:
錯誤報告函數的代碼:
A.2錯誤處理包裝函數
- Unix風格的錯誤處理包裝函數
? ? ? ? 如果wait返回一個錯誤,包裝函數打印一條信息,然后退出.否則,他向調用者返回一個PID
- Posix風格的錯誤處理包裝函數
? ? ? ? 他的錯誤返回碼中不會包含有用的結果,所以成功時,包裝函數返回void
- DNS風格的錯誤處理包裝函數
轉載于:https://www.cnblogs.com/20135305yg/p/4933950.html
總結
以上是生活随笔為你收集整理的信息安全系统设计基础第九周总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Yii2的深入学习--yii\base\
- 下一篇: CKEditor上传图片—配置CKFin