10系統級i/o
10.1 unix i/o
這一節涉及到作業系統的基本抽象之一——檔案。也就是說,所有的i/o裝置都被模型化為檔案,而所有的輸入輸出都被當做對相應檔案的讀/寫。相關的執行動作如下:
開啟檔案:
應用程式向核心發出請求→要求核心開啟相應的檔案→核心返回檔案描述符
檔案描述符:
標準錯誤——2(stderr_fileno)
改變當前的檔案位置
通常,讀,寫操作都從當前檔案偏移量處開始(也就是檔案位置),並使偏移量增加所讀寫的位元組數,可以理解為游標所在的位置。
當開啟乙個檔案的最初時候檔案的偏移量為0.
通過seek操作,可以顯示的設定檔案的當前位置為k。
讀寫檔案
讀
讀操作就是從檔案拷貝n>0個位元組到儲存器,並且改變檔案當前位置。(如果當前位置是k,則改變為k+n)
寫
寫操作是從儲存器拷貝n>0個位元組到乙個檔案,然後更新當前檔案位置。
關閉檔案
應用通知核心關閉檔案→核心釋放檔案開啟時的資料結構→恢復描述符→釋放儲存器資源。
10.2開啟和關閉檔案
1.open函式
(1)函式定義:
#include
#include
#include
intopen(char *filename, int flags, mode_t mode);
(2)引數解析:
這些值可以用或連線起來。
mode:指定了新檔案的訪問許可權位
2.close函式
(1)函式定義:
#include
intclose(intfd);
(2)引數解析:
10.3讀和寫檔案
1.讀read
(1)函式原型:
#include
ssize_tread(intfd, void *buf, size_t n);
(2)引數解析:
2.寫write
(1)函式原型:
#include
ssize_twrite(intfd, void *buf, size_t n);
(2)引數解析:
3.通過lseek函式可以顯式的修改當前檔案的位置
4.不足值
不足值指在某些情況下,read和write傳送的位元組比應用程式要求的要少,原因如下:
10.4 rio包健壯的讀寫
1.rio的無緩衝的輸入輸出函式。
作用是直接在儲存器和檔案之間傳送資料,常適用於網路和二進位制資料之間。
rio_readn函式和rio_writen定義:
ssize_trio_readn(intfd, void *usrbuf, size_t n);
ssize_trio_writen(intfd, void *usrbuf, size_t n);
引數:返回值:
rio_writen成功則返回傳送的位元組數,出錯為-1,沒有不足值。
2.rio的帶緩衝的輸入函式
可高效的從檔案中讀取文字行和二進位制資料。
乙個文字行就是乙個由換行符結尾的ascii碼字串行。
rio_readnb函式
ssize_trio_readnb(rio_t *rp, void *usrbuf, size_tn)
elseif (nread == 0)
break; /* eof */
nleft -= nread;
bufp += nread;
}return (n - nleft); /* 返回成功傳送的位元組數*/
}rio_readlineb函式
ssize_trio_readlineb(rio_t *rp, void *usrbuf, size_tmaxlen)
elseif (rc == 0) else
return -1; /* 錯誤,返回-1 */
}*bufp = 0;
returnn;//返回成功傳送的位元組數
}10.5讀取檔案元資料
元資料即檔案資訊,需要用到的函式是stat和fstat。定義如下:
#include
#include
intstat(constchar *filename, struct stat *buf);
intfstat(intfd,struct stat *buf);
返回值:成功為0,錯誤為-1
引數:stat需要輸入檔名,而fstat需要輸入的是檔案描述符。
關於stat資料結構如下圖:
st_mode:包編碼檔案訪問許可位和檔案型別。許可位在第一節提到了,unix檔案型別如下,並有對應的巨集指令,含義均為「是xx嗎」,這些巨集在sys/stat.h中定義:
套接字 通過網路與其他程序通訊的檔案 s_issock()
10.6共享檔案
每個描述符都有它自己的檔案位置,所以對不同描述符的讀操作可以從檔案的不同位置獲取資料。
子程序繼承父程序的開啟檔案:
參考資料
1.2035202閆佳歆與20135302魏靜靜
2.《深入理解計算機系統》
stdio.h 標準輸入輸出
stdlib.h c標準函式庫
unistd.h unix類系統定義符號常量
fcntl.h 定義了很多巨集和open,fcntl函式原型
sys/types.h 基本系統資料型別
dirent.h unix類目錄操作的標頭檔案,包含了許多unix系統服務的函式原型,例如opendir函式、readdir函式。
termios.h 在posix規範中定義的標準介面
學習總結遇到的問題:
6h10h
實踐**:下面四圖各為老師給的**執行的結果。cp1,cp2,who1,who2
資訊保安系統設計基礎第九周總結
第十章 系統級i o 輸入操作是從i o裝置拷貝資料到主存,輸出操作是從主存拷貝資料到i o裝置 10.1unix i o 乙個unix檔案就是乙個m個位元組的序列 所有的i o裝置都被模型化為檔案,所有的輸入和輸出都被當作對相應檔案的讀和寫來執行.這種將裝置影射為檔案的方式,稱為unix i o ...
20135337 資訊保安設計基礎第九周學習筆記
這次實踐內容是學習ls who echostate filesize fileinfo spwd testioctl等命令的具體實現功能的c 功能 複製檔案或目錄 說明 cp指令用於複製檔案或目錄,如同時指定兩個以上的檔案或目錄,且最後的目的地是乙個已經存在的目錄,則它會把前面指定的所有檔案或目錄複...
《資訊保安專業導論》第九周學習總結
這個作業屬於哪個課程 這個作業要求在 作業要求的鏈結 如2020 2021 1資訊保安專業導論第九周作業 這個作業的目標 總結第九周學習內容 作業正文 自學了pygame的部分內容,嘗試去編寫了俄羅斯方塊。學習了linux系統的一些操作,更好地使用虛擬機器。學習了解了排名前50的部分語言。改進情況 ...