第十章 系統級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
--------------------------------------------------------------
參考資料:
深刻理解計算機操做系統
視頻