20135205信息安全系統設計基礎第九周學習總結

第十章 系統級I/O數據結構

-------------------------------------------------------------------------------------------------------------------------------------函數

I/Ospa

一個Unix文件就是一個m個字節的序列:B0,B1,.......,Bk,......,Bm-1操作系統

打開文件:一個應用程序經過要求內核打開相應的文件,來宣告它想要訪問一個I/O設備。視頻

      內核返回一個小的非負整數,叫作描述符,它在後繼對此文件的全部操做中標識這個文件。內核記錄有關這個打開文件的全部信息。應用程序只需記住這個標識符。索引

Unix外殼建立的每一個進程開始時都有三個打開的文件:標準輸入(描述符爲0)、標準輸出(1)和標準錯誤(2)。進程

改變當前的文件位置:對於每一個打開的文件,內核保持着一個文件位置k,初始爲0。資源

          這個文件位置是從文件開頭起始的字節偏移量。應用程序可以經過執行seek操做,顯示地設置文件的當前位置爲k。字符串

讀寫文件:一個讀操做就是從文件拷貝n>0個字節到存儲器,從當前文件位置k開始,而後將k增長到k+n。get

      給定一個大小爲m字節的文件,當k》m時執行讀操做會觸發一個稱爲end-of-file(EOF)的條件,應用程序能檢測到這個條件。在文件的結尾處並無明確的「EOF符號」。

      相似地寫操做就是從存儲器拷貝n>0個字節到一個文件,從當前文件位置k開始,而後更新k。

關閉文件:當應用完成了對文件的訪問以後,它就通知內核關閉這個文件。做爲響應,內核釋放文件打開時建立的數據結構,並將這個描述符恢復到可用的描述符池中。

      不管一個進程由於何種緣由終止時,內核都會關閉全部打開的文件並釋放他們的存儲器資源。

打開關閉文件

open函數:打開一個已存在的文件或者建立一個新文件

      此函數將filename轉換爲一個文件描述符,而且返回描述符數字。返回的描述符老是在進程中當前沒有打開的最小描述符。flags參數指明瞭進程打算如何訪問這個文件。

      O_RDONLY只讀

      O_WRONLY只寫

      O_RDWR可讀可寫

      書中例子:fd = Open("foo.txt",O_RDONLY, 0)

flags參數也能夠是一個或者更多位掩碼的或,爲寫提供給一些額外的指示:

      O_CREAT若是文件不存在,就建立它的一個截斷的(空)文件

      O_TRUNC若是文件已經存在,就截斷它

      O_APPEND在每次寫操做前,設置文件位置到文件的結尾處。

      書中例子:fd = Open("foo.txt",O_WDONLY|O_APPEND, 0)

mode參數指定了新文件的訪問權限位。

讀寫文件文件

調用read和write函數進行輸入和輸出的。

經過調用lseek函數,應用程序可以顯示地修改當前文件的位置,這部份內容不在咱們的討論範圍以內。

用RIO包健壯地讀寫

一、無緩衝的輸入輸出函數

調用rio_readn和rio_writen函數,應用程序能夠在存儲器和文件之間直接傳送數據。

二、帶緩衝的輸入函數

一個文本行就是一個由換行符結尾的ASCLL碼字符序列。

調用一個包裝函數,他從一個內部讀緩衝區拷貝一個文本行,當緩衝區邊空時,會自動地調用read從新填滿緩衝區。

讀取文件元數據

調用stat和fstat函數,檢索到關於文件的信息(也稱爲文件的元數據)

stat函數以一個文件名做爲輸入,並填寫其數據結構中的各個成員。

fstat函數是類似的,只不過是以文件描述符而不是文件名做爲輸入。

共享文件

描述符表:每一個進程都有它獨立的描述符表,它的表項是由進程打開的文件描述符來索引的。每一個打開的描述符表項指向文件表中的一個表項。

文件表:打開文件的集合是由一張文件表來表示的,全部進程共享這張表.

V-NODE表:同文件表同樣,全部的進程共享這張V-NODE表。每一個表項包含stat結構中的大多數信息。

I/O重定向

Unix外殼提供了I/O重定向操做符,容許用戶將磁盤文件和標準輸入輸出聯繫起來。

dup2函數:拷貝描述符表表項oidfd到描述符表表項newfd,覆蓋描述符表表項newfd之前的內容。若是newfd已經打開了,dup2會在拷貝oldfd以前關閉newfd。

標準I/O

ANSI c定義了一組高級的輸入輸出函數 稱爲I/O庫

提供了打開和關閉函數:fopen和oclose

   讀和寫字節的函數:fread和fwrite

   讀和寫字符串:fgets和fputs

   複雜的格式化的I/O函數:scanf和printf

 --------------------------------------------------------------

參考資料:

深刻理解計算機操做系統

視頻

相關文章
相關標籤/搜索