版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第六章 文件系統(tǒng),訾小超,2,本章主要內(nèi)容:,文件系統(tǒng)概述 文件存儲(chǔ)和磁盤管理的基本知識(shí) 文件目錄 文件存儲(chǔ)資源分配與管理 UNIX的文件存儲(chǔ)和管理 文件系統(tǒng)相關(guān)的操作 文件系統(tǒng)對(duì)上層的接口:系統(tǒng)調(diào)用 文件相關(guān)的標(biāo)準(zhǔn)I/O庫(kù)函數(shù):標(biāo)準(zhǔn)子例程 管道文件和管道通信 Linux文件系統(tǒng)簡(jiǎn)介,3,1、基本概念,1-1 文件系統(tǒng)出現(xiàn)的背景 在程序結(jié)束后,可能會(huì)產(chǎn)生一些運(yùn)行結(jié)果數(shù)據(jù),這些數(shù)據(jù)并不會(huì)隨程序結(jié)束而結(jié)束,需要存儲(chǔ)在永久性的磁介質(zhì)上。 早期數(shù)據(jù)管理的特點(diǎn): 用戶自行管理輔助存儲(chǔ)器上的信息 按照物理地址安排信息,組織數(shù)據(jù)的輸入輸出,4,早期數(shù)據(jù)管理的不足: 繁瑣復(fù)雜、易于出錯(cuò)、可靠性差。 數(shù)據(jù)共享難
2、以實(shí)現(xiàn)。 磁介質(zhì)難以共享。 如果共享磁介質(zhì),難以有效實(shí)現(xiàn)文件和其它用戶(非文件主人)的隔離 存儲(chǔ)介質(zhì)的技術(shù)發(fā)展 卡片:小容量 磁帶:大容量、順序存取 磁盤:大容量、隨機(jī)存取,5,隨著應(yīng)用需求和技術(shù)發(fā)展,數(shù)據(jù)管理逐漸由個(gè)人向系統(tǒng)級(jí)發(fā)展: 在操作系統(tǒng)級(jí)出現(xiàn)了專門管理數(shù)據(jù)的實(shí)用工具。 最后這些實(shí)用工具集成到操作系統(tǒng)的內(nèi)部,以系統(tǒng)調(diào)用的形式向應(yīng)用程序提供數(shù)據(jù)管理服務(wù)。 這就形成了文件系統(tǒng)的雛形。,6,1-2 文件系統(tǒng)的目標(biāo)和要求 目標(biāo):方便用戶管理自己的數(shù)據(jù)資源 基本要求: 文件按名存儲(chǔ) 文件有序組織,文件名分層次管理 如支持樹(shù)形目錄結(jié)構(gòu) 操作簡(jiǎn)單,存取效率高。 其它要求: 支持多用戶系統(tǒng),多用戶能夠
3、共享同一個(gè)磁介質(zhì)。 有一定的安全性保證,最好能進(jìn)行數(shù)據(jù)恢復(fù)。 存儲(chǔ)空間的利用率高,7,1-3 文件系統(tǒng)的概念 文件: 由文件名字標(biāo)識(shí)的一組相關(guān)信息的集合。文件名是字母或數(shù)字組成的字母數(shù)字串 文件系統(tǒng): 軟件觀點(diǎn):操作系統(tǒng)中,為用戶和應(yīng)用程序管理文件的系統(tǒng)軟件集合。 存儲(chǔ)格式觀點(diǎn):文件系統(tǒng)是文件在存儲(chǔ)介質(zhì)上保存和管理相關(guān)的約定。在操作系統(tǒng)中,這種約定的實(shí)現(xiàn)也被稱為文件系統(tǒng)。一種相關(guān)約定就對(duì)應(yīng)一種文件系統(tǒng),所以目前存在多種文件系統(tǒng):MSDOS,F(xiàn)AT32,NTFS,EXT2等。,8,操作系統(tǒng)和文件系統(tǒng) 早期:一個(gè)操作系統(tǒng)一般都支持一種文件系統(tǒng)。在設(shè)計(jì)操作系統(tǒng)時(shí),常常會(huì)專門為此設(shè)計(jì)一種文件系統(tǒng)。如M
4、SDOS,Windows95,Windows98,WindowsNT,Unix,Linux等 目前:為實(shí)現(xiàn)文件和文件系統(tǒng)共享,一個(gè)操作系統(tǒng)除支持為它設(shè)計(jì)的文件系統(tǒng)外,還可能支持其他文件系統(tǒng)。如Linux支持Ext2,F(xiàn)AT等。,9,1-4、引入文件系統(tǒng)的好處 方便用戶使用, 用戶不必了解信息存儲(chǔ)的方法、位置以及存儲(chǔ)設(shè)備實(shí)際運(yùn)作方式等細(xì)節(jié) 只要知道文件名,可存取信息,實(shí)現(xiàn)了“按名存取” 安全可靠性 用戶通過(guò)文件系統(tǒng)才能實(shí)現(xiàn)對(duì)文件的訪問(wèn),故可防止對(duì)文件信息無(wú)意的破壞。 而文件系統(tǒng)能提供各種安全、保密和保護(hù)措施。 方便數(shù)據(jù)共享 移動(dòng)存儲(chǔ)設(shè)備。 各種形式的文件鏈接,不同的用戶可以使用同名或異名的同一文
5、件,10,1-5、文件的命名 文件名是字母或數(shù)字組成的字母數(shù)字串,在一些文件系統(tǒng)中還可能包含其它字符,如下劃線等。 各種文件系統(tǒng)的文件命名規(guī)則略有不同,即文件名的格式和長(zhǎng)度因系統(tǒng)而異。 MSDOS文件系統(tǒng),一個(gè)文件的名字包括文件名和擴(kuò)展名兩部分;前者長(zhǎng)度為1到8個(gè)字符;后者長(zhǎng)度為0到3個(gè)字符;中間用一個(gè)圓點(diǎn)隔開(kāi) NTFS:支持多達(dá)255個(gè)字符的文件 ,而且區(qū)分大小寫,11,1-6、文件的類型(5大文件類型) 普通文件:即前面所討論的存儲(chǔ)在外存設(shè)備上的數(shù)據(jù)文件。 目錄文件? 管道文件? 塊設(shè)備文件:在unxi/Linux等操作系統(tǒng)中,對(duì)應(yīng)于磁盤、光盤或磁帶等塊設(shè)備的文件。 字符設(shè)備文件:在unx
6、i/Linux等操作系統(tǒng)中,對(duì)應(yīng)于終端、打印機(jī)等字符設(shè)備的文件。,12,1-7、文件的屬性(*) 文件的類型屬性:如普通文件、目錄文件、系統(tǒng)文件、隱式文件、設(shè)備文件等。 文件的保護(hù)屬性:如可讀、可寫、可執(zhí)行、可創(chuàng)建、可刪除等。 創(chuàng)建者屬性: 創(chuàng)建和訪問(wèn)時(shí)間屬性: 文件大小: 注:文件的屬性隨具體的需求和文件系統(tǒng)有關(guān)系,13,1-8、數(shù)據(jù)的邏輯層次結(jié)構(gòu) 字段: 最基本的語(yǔ)義單位。 記錄: 多個(gè)字段的集合 文件 相同格式記錄的集合,14,1-9、文件的邏輯組織方式 (記錄) 堆文件 數(shù)據(jù)按到達(dá)的時(shí)間順序收集起來(lái),每一個(gè)記錄包含了一堆集中到達(dá)的數(shù)據(jù)。 無(wú)規(guī)則的記錄結(jié)構(gòu):每個(gè)記錄中字段(數(shù)量或次序)可
7、能不同,字段需要有自描述性:字段名和字段值。 數(shù)據(jù)檢索復(fù)雜 一般用于:數(shù)據(jù)收集時(shí),暫存數(shù)據(jù)。,15,順序存?。?按記錄順序進(jìn)行讀寫操作的存取方法稱順序存取 記錄格式固定:字段個(gè)數(shù)、字段長(zhǎng)度、字段次數(shù)都是固定的,每個(gè)記錄都是相同的。 只需存儲(chǔ)字段的值,字段名和字段長(zhǎng)度由文件結(jié)構(gòu)屬性確定。 使用特點(diǎn) 一般用于順序處理或批處理 對(duì)記錄查詢或記錄更新,效率比較低 在以磁帶作為主要存儲(chǔ)介質(zhì)的時(shí)代,比較流行。,16,直接存取/隨機(jī)存儲(chǔ) (kw:地址) 要求以任意次序直接讀寫某個(gè)記錄 隨機(jī)存取文件一般存放在磁盤等大容量、支持按地址存取的設(shè)備上。 為了實(shí)現(xiàn)直接存取,一個(gè)文件可以看作由順序編號(hào)的物理塊組成的。
8、直接存取文件對(duì)讀或?qū)憠K的次序沒(méi)有限制。 用戶提供給操作系統(tǒng)的是相對(duì)塊號(hào):相對(duì)于文件開(kāi)始位置的一個(gè)位移量。 絕對(duì)塊號(hào)則由操作系統(tǒng)換算而得到,17,索引存取 (kw:索引) 基于索引文件(?)的索引存取方法 文件中的記錄不按它在文件中的位置,而按它的記錄鍵來(lái)編址。 信息塊的地址都可以通過(guò)查找記錄鍵而換算出。 實(shí)際的系統(tǒng)中,大都采用多級(jí)索引,以加速記錄查找過(guò)程。 散列存?。?直接由散列函數(shù)計(jì)算出特定記錄的物理塊位置。 是索引存取的特例,18,1-10、常見(jiàn)操作系統(tǒng)的文件組織結(jié)構(gòu) Linux, Windows, Unix等OS的文件組織結(jié)構(gòu) 分為兩層: 操作系統(tǒng)層:順序文件和隨機(jī)文件。 用戶自定義層:
9、索引文件和散列文件等。 對(duì)磁盤文件而言,操作系統(tǒng)提供隨機(jī)訪問(wèn)支持。 訪問(wèn)的時(shí)候需要給出距文件開(kāi)頭處的偏移量,操作系統(tǒng)自動(dòng)根據(jù)偏移量換算出在磁盤上的物理塊。 如何計(jì)算偏移量,是通過(guò)索引文件還是通過(guò)散列運(yùn)算得到,是由用戶設(shè)計(jì)的。,19,1-11、文件系統(tǒng)的界面-標(biāo)準(zhǔn)的文件操作 建立文件:當(dāng)用戶要求把一批信息作為一個(gè)文件存放在存儲(chǔ)器中時(shí),使用建立操作向系統(tǒng)提出建立一個(gè)文件的要求。 打開(kāi)文件:文件建立之后能立即使用,要通過(guò)打開(kāi)文件操作建立起文件和用戶之間的聯(lián)系。 讀/寫文件:文件打開(kāi)以后,就可以用讀/寫系統(tǒng)調(diào)用訪問(wèn)文件。 文件控制:文件打開(kāi)以后,把文件的讀寫指針定位到文件頭、文件尾、或文件中的任意位置
10、,或執(zhí)行前跳、后退等各種控制操作。 關(guān)閉文件:當(dāng)一個(gè)文件使用完畢后,使用者應(yīng)關(guān)閉文件以便讓別的使用者用此文件。 撤銷文件:當(dāng)一個(gè)文件不再需要時(shí),可向系統(tǒng)提出撤銷文件。,20,2、文件存儲(chǔ)和磁盤管理,2-1、需要存儲(chǔ)的內(nèi)容 文件的具體內(nèi)容: 文件的相關(guān)屬性 文件名 文件的訪問(wèn)權(quán)限信息 文件的主人信息 文件的創(chuàng)建、修改等時(shí)間信息,21,2-2、文件信息的存儲(chǔ)方式 方式一: 兩類信息一起存放。先文件名,后跟文件的其它屬性,最后跟文件的具體內(nèi)容。 對(duì)磁盤塊的分配提出較高的要求,文件需要占用“連續(xù)”的磁盤塊。 文件檢索非常困難。 修改也非常困難,文件一旦變長(zhǎng),需要進(jìn)行大規(guī)模的存儲(chǔ)移動(dòng)。,22,方式二:
11、屬性信息和文件內(nèi)容分開(kāi)存放。 文件內(nèi)容以磁盤塊為單位,主要結(jié)合塊設(shè)備的存取特點(diǎn)。 屬性信息集中存放。由于磁盤按塊存儲(chǔ),可能會(huì)出現(xiàn)幾個(gè)文件的屬性信息存在一個(gè)盤塊中。 文件屬性和文件內(nèi)容不連續(xù)存放,之間有鏈接關(guān)系存在。 技巧: 同一目錄下的所有文件的屬性信息一起存儲(chǔ)。 屬性相關(guān)信息作為上級(jí)目錄的目錄文件內(nèi)容。,23,2-3、目錄的引入和組織 目錄存在的好處 便于用戶對(duì)文件進(jìn)行分門別類、層次式的進(jìn)行管理。 可以加快文件的檢索速度。 便于實(shí)現(xiàn)用戶之間的文件隔離。 便于實(shí)現(xiàn)對(duì)同類文件的保護(hù)。只要對(duì)目錄設(shè)置特定保護(hù)權(quán)限,可以實(shí)現(xiàn)對(duì)目錄下文件的保護(hù),24,目錄的內(nèi)容和存儲(chǔ): 目錄的內(nèi)容保存了文件屬性,并實(shí)現(xiàn)
12、了到具體文件內(nèi)容的映射。 以特殊文件(目錄文件)的形式存在,可以通過(guò)遞歸方式實(shí)現(xiàn)對(duì)具體文件的訪問(wèn)。 即:所有文件(包括一般文件和目錄文件)組成一個(gè)樹(shù)形層次結(jié)構(gòu),樹(shù)的中間結(jié)點(diǎn)為目錄文件,樹(shù)的葉子結(jié)點(diǎn)為一般文件。,25,2-4、目錄文件的具體內(nèi)容 目錄下所有文件(含子目錄)的屬性信息:文件名,文件屬性,文件內(nèi)容存儲(chǔ)的位置。 每個(gè)文件對(duì)應(yīng)的信息成為一個(gè)目錄項(xiàng)。也就是說(shuō)目錄文件的內(nèi)容是目錄項(xiàng)的集合。,26,每個(gè)目錄項(xiàng)包括: 基本信息 文件名: 在一個(gè)特定的目錄中具有唯一性。 文件類型: 例如文本文件,二進(jìn)制文件,目標(biāo)模塊等。 文件組織: 系統(tǒng)所支持的不同組織形式。 存儲(chǔ)信息 地址信息: 文件存放在磁盤
13、的物理地址(例如:柱面號(hào)、磁道號(hào)或在磁盤上的塊號(hào))。兩種方式: 起始地址 扇區(qū)地址數(shù)組 文件的大小,以字節(jié)、字或塊計(jì)。,27,存取控制信息 文件主: 擁有文件的控制權(quán)。文件主能授予和取消其他用戶對(duì)文件的存取權(quán)和改變這些權(quán)限。 允許的操作: 控制讀、寫、執(zhí)行和在網(wǎng)上的傳輸?shù)取?使用信息 創(chuàng)建日期: 文件首次存放在目錄中的時(shí)間。 讀時(shí)間: 最后一次讀文件的時(shí)間。 修改時(shí)間: 最后一次更新、插入或刪除的時(shí)間。,28,實(shí)例:MSDOS(FAT)的目錄項(xiàng)結(jié)構(gòu) 共32個(gè)字節(jié) 文件名:8+3字節(jié) 文件屬性:1字節(jié) 保留:10字節(jié) 時(shí)間:2字節(jié) 日期:2字節(jié) 內(nèi)容的起始?jí)K號(hào)(簇號(hào)):2字節(jié) 文件長(zhǎng)度:4字節(jié),
14、29,2-5、目錄文件的訪問(wèn)特點(diǎn) 間接式訪問(wèn): 一般情況下操作系統(tǒng)不允許通過(guò)Read或Write直接對(duì)目錄文件的內(nèi)容進(jìn)行訪問(wèn)。 如果用戶(或應(yīng)用程序)對(duì)目錄下文件的訪問(wèn)導(dǎo)致了目錄下文件屬性的改變,那么操作系統(tǒng)會(huì)自動(dòng)修改文件對(duì)應(yīng)的目錄項(xiàng),也就是說(shuō)修改目錄文件的內(nèi)容。 如果對(duì)目錄文件的屬性進(jìn)行修改,那么與該目錄文件的內(nèi)容沒(méi)有關(guān)系,實(shí)際上是:修改上級(jí)目錄文件的內(nèi)容。,30,2-6、文件存儲(chǔ)需要考慮的問(wèn)題 占用空間是否連續(xù) 分配連續(xù)的磁盤空間: 對(duì)大文件順序讀些,訪問(wèn)速度快 只需保存第一個(gè)磁盤塊的地址即可。 分配不連續(xù)的磁盤空間: 順序讀寫稍慢(尋道時(shí)間開(kāi)銷大) 地址轉(zhuǎn)換表較為復(fù)雜。 創(chuàng)建新文件時(shí):
15、如何為該文件分配存儲(chǔ)空間 如何記錄磁盤塊的分配狀況 已分配 未分配,31,2-7、分配策略 預(yù)分配: 若文件需占用連續(xù)的磁盤空間,就要采用預(yù)分配的策略。 實(shí)現(xiàn)思路:在文件創(chuàng)建的時(shí)候,為文件分配連續(xù)的磁盤空間(稱為一個(gè)分區(qū))。 特點(diǎn): 無(wú)法預(yù)知文件的未來(lái)大小,可能會(huì)出現(xiàn)分區(qū)浪費(fèi)和預(yù)留分區(qū)的大小不夠。 或者:創(chuàng)建時(shí)要求用戶說(shuō)明文件的最大長(zhǎng)度。 動(dòng)態(tài)分配: 在使用時(shí),按文件大小分配磁盤空間。 一般占有不連續(xù)的磁盤塊。,32,2-8、linux系統(tǒng)的磁盤分配實(shí)際方式 采用不連續(xù)的存儲(chǔ)方式,如Linux下的EXT2文件系統(tǒng) 特例:對(duì)特殊文件,如磁盤交換文件,核心映像文件等,需要占用連續(xù)的磁盤地址空間。,
16、33,2-9、空閑磁盤塊的管理 一般而言已經(jīng)分配出去的磁盤塊,都有目錄文件的目錄項(xiàng)的某些字段指向: 對(duì)空閑磁盤塊的標(biāo)示: 位圖: 每個(gè)二進(jìn)制位對(duì)應(yīng)一個(gè)磁盤塊的狀態(tài),0表示空閑塊,1表示已被使用。 查找空閑磁盤塊方便 占用的空間比較小 Linux的文件系統(tǒng)EXT2主要采用這種方式,34,空閑鏈表: 把相鄰的空閑磁盤塊看成一個(gè)空閑分區(qū) 把空閑分區(qū)按鏈表的方式組織起來(lái) 不真正占用磁盤空間,空閑塊檢索的效率相對(duì)降低 Unix的文件系統(tǒng)主要采用這種方式 索引: 將空閑存儲(chǔ)區(qū)當(dāng)做文件一樣處理。,35,3、Unix/Linux文件系統(tǒng)存儲(chǔ)組織,3-1、簡(jiǎn)單文件系統(tǒng)的存儲(chǔ)組織回顧 特點(diǎn): 目錄文件的目錄項(xiàng)中包
17、含文件的所有屬性信息、地址信息等。 不足: 目錄項(xiàng)中字段數(shù)很多,且目錄項(xiàng)不規(guī)則,可能存在一些可變字段。 不便于實(shí)現(xiàn)文件和目錄共享。 目錄檢索速度較慢 文件屬性信息分散存放,文件系統(tǒng)的可靠性差。,36,3-2、復(fù)雜文件系統(tǒng)的組織思路 把文件名信息存放在目錄項(xiàng)中 把其余的屬性信息存放在一個(gè)單獨(dú)的結(jié)構(gòu)中。 在目錄項(xiàng)中,保存該單獨(dú)結(jié)構(gòu)的地址信息,37,3-3、索引節(jié)點(diǎn) 存放文件屬性信息(除文件名)的數(shù)據(jù)結(jié)構(gòu),叫索引節(jié)點(diǎn),或Inode,I節(jié)點(diǎn)。 I節(jié)點(diǎn)的結(jié)構(gòu): struct dinode ushort di_mode; 文件控制模式 short di_nlink; 文件的鏈接數(shù) ushort di_ui
18、d; 文件主用戶標(biāo)識(shí)數(shù) ushort di_gid; 文件主同組用戶組標(biāo)識(shí)數(shù) off_t di_size; 文件長(zhǎng)度,以字節(jié)為單位 char di_addr40; 地址索引表,存放文件的盤塊號(hào) time_t di_atime; 文件最近一次訪問(wèn)時(shí)間 time_t di_mtime; 文件最近一次修改時(shí)間 time_t di_ctime; 文件創(chuàng)建時(shí)間 char di_addr40 每三個(gè)字節(jié)表示一個(gè)磁盤號(hào) 相當(dāng)于能夠表示13個(gè)磁盤號(hào)的數(shù)組,38,3-4、磁盤塊的索引結(jié)構(gòu) I節(jié)點(diǎn)中的13個(gè)地址索引表項(xiàng),對(duì)應(yīng)不同的意義。 前10個(gè)表項(xiàng)是直接尋址。 直接存放文件前10磁盤塊地址。 假定一個(gè)磁盤塊1K
19、,那么可以表示10K以內(nèi)的文件 如果文件大小可用10以內(nèi)磁盤塊保存,后面間接尋址不使用。 第11個(gè)表項(xiàng)是一級(jí)間接尋址。 表示的磁盤塊不是直接存放文件的內(nèi)容,而是存放直接尋址表項(xiàng)。即表明1024/3個(gè)磁盤塊號(hào),用于存放文件內(nèi)容。 該級(jí)地址最多可表示文件大小1024/3*1024。,39,第12個(gè)表項(xiàng)是二級(jí)間接尋址。 表示的磁盤塊不是直接存放文件,而是存放一級(jí)間接尋址表項(xiàng)。即表明1024/3個(gè)磁盤塊號(hào),用于存放一級(jí)尋址表項(xiàng)。 該級(jí)地址最多可表示文件大小1024/3*1024/3*1024。 第13個(gè)表項(xiàng)是三級(jí)間接尋址。 表示的磁盤塊不是直接存放文件,而是存放二級(jí)間接尋址表項(xiàng)。即表明1024/3個(gè)磁
20、盤塊號(hào),用于存放二級(jí)尋址表項(xiàng)。 該級(jí)地址最多可表示文件大小1024/3*1024/3*1024/3*1024。,40,圖6-4 UNIX文件索引結(jié)構(gòu),41,3-5、目錄項(xiàng)結(jié)構(gòu) 每個(gè)目錄項(xiàng)由2字節(jié)的I節(jié)點(diǎn)號(hào)和 14字節(jié)的文件名分量組成,一些UNIX系統(tǒng)的文件名分量可擴(kuò)展。 struct direct ino_t d_ino; /* 對(duì)應(yīng)文件的I節(jié)點(diǎn) */ char d_name 14;/* 文件名 */ ,42,3-6目錄結(jié)構(gòu) UNIX將同一目錄下的所有文件的目錄項(xiàng)數(shù)據(jù)組成一個(gè)目錄文件 目錄文件和一般文件用同樣的方式存儲(chǔ),只是目錄文件的內(nèi)容是目錄下所有文件/子目錄對(duì)應(yīng)的目錄項(xiàng)。 目錄文件中的前二
21、個(gè)目錄項(xiàng)的文件名比較特殊,它們?yōu)椤?”和“. ”,分別表示當(dāng)前目錄和父目錄,它們的I節(jié)點(diǎn)號(hào)就是當(dāng)前目錄文件的I節(jié)點(diǎn)號(hào)和上一級(jí)目錄文件的I節(jié)點(diǎn)號(hào),便于向上回溯。 根目錄文件是無(wú)名的,也沒(méi)有目錄項(xiàng),它對(duì)應(yīng)的I節(jié)點(diǎn)在磁盤固定位置。 從根開(kāi)始,根目錄的下級(jí)目錄的名字存放在根目錄文件的目錄項(xiàng)中,并各有一個(gè)指針指示下級(jí)目錄文件的I節(jié)點(diǎn)。如此一級(jí)一級(jí)擴(kuò)展下去,直至最底層的數(shù)據(jù)文件或空的目錄文件,構(gòu)成了整個(gè)UNIX的樹(shù)型目錄結(jié)構(gòu),43,I節(jié)點(diǎn),目錄 文件塊,目錄項(xiàng)n,目錄項(xiàng)1,文件物理盤塊,圖6-6 UNIX目錄系統(tǒng)結(jié)構(gòu),di_addr ,di_addr ,目錄項(xiàng),目錄項(xiàng),根目錄 文件塊,目錄項(xiàng)n,目錄項(xiàng)1,
22、根目錄文件 I節(jié)點(diǎn),i_addr ,44,3-7、文件和目錄共享 不同目錄項(xiàng)(同一目錄文件或不同的目錄文件中)指向同一個(gè)索引節(jié)點(diǎn) 一個(gè)文件可以有多個(gè)不同的名字 每個(gè)名字叫做一個(gè)鏈接 通過(guò)I節(jié)點(diǎn)方便實(shí)現(xiàn)文件共享。,45,3-8、文件搜索 路徑表示方式: 絕對(duì)路徑:從根目錄到文件的具體位置 相對(duì)路徑:從當(dāng)前目錄到文件的具體位置,46,絕對(duì)路徑搜索:如/etc/passwd, 系統(tǒng)先得到根I節(jié)點(diǎn),再根據(jù)其中的地址索引表將根目錄文件的盤塊內(nèi)容讀入內(nèi)存, 逐項(xiàng)比較,看其中是否有一個(gè)目錄項(xiàng)的文件名與根的下一層路徑名分量,如etc,相匹配。 找到匹配項(xiàng)后,根據(jù)該項(xiàng)的I節(jié)點(diǎn)號(hào)再得到下層目錄文件的I節(jié)點(diǎn)。通過(guò)該
23、I節(jié)點(diǎn)的地址索引表,讀入etc目錄文件的物理盤塊。 在該盤塊中再逐項(xiàng)比較,直至找到文件名為passwd的目錄項(xiàng)并獲得passwd文件的I節(jié)點(diǎn) 讀取passwd文件的各個(gè)物理盤塊內(nèi)容 相對(duì)路徑搜索: 除了起始搜索點(diǎn)是當(dāng)前目錄項(xiàng)的I節(jié)點(diǎn)外,其余與絕對(duì)路徑搜索并無(wú)不同。,47,3-9、UNIX文件系統(tǒng)在磁盤的存儲(chǔ)布局 分布概述: 一個(gè)物理磁盤能夠被劃分成多個(gè)邏輯分區(qū),相當(dāng)于一個(gè)邏輯盤。對(duì)每一個(gè)邏輯盤,盤塊的物理地址是連續(xù)的。 可以把一個(gè)邏輯盤的存儲(chǔ)地址空間堪稱一個(gè)一維的線性空間。 一個(gè)文件系統(tǒng)對(duì)應(yīng)一個(gè)邏輯盤。一個(gè)物理磁盤上可以同時(shí)存在多個(gè)文件系統(tǒng)。,48,在一個(gè)邏輯盤上,其存儲(chǔ)空間安排如:,49,引
24、導(dǎo)塊: 在塊號(hào)為0的引導(dǎo)塊中包含操作系統(tǒng)的自舉程序 該塊不屬于文件系統(tǒng)一部分。 有些邏輯分區(qū)上沒(méi)有這一塊的內(nèi)容 進(jìn)程對(duì)換區(qū): 連續(xù)磁盤區(qū)域。用于是換入/換出,作為內(nèi)存的擴(kuò)充。 該塊不屬于文件系統(tǒng)的一部分。 有些系統(tǒng),如Linux,可以以單獨(dú)的一個(gè)邏輯盤作為交換區(qū),50,超級(jí)塊 用于存放文件系統(tǒng)的核心數(shù)據(jù) 各部分的盤塊分布 空閑節(jié)點(diǎn)數(shù),空閑節(jié)點(diǎn)表 空閑盤塊數(shù),空閑盤塊索引 文件系統(tǒng)的類型、版本號(hào),文件系統(tǒng)的狀態(tài) 超級(jí)塊在文件系統(tǒng)啟動(dòng)時(shí),為了快速更新,被復(fù)制到內(nèi)存一份。定時(shí)更新磁盤上超級(jí)塊 為了保證超級(jí)塊的安全性,超級(jí)塊在磁盤上有備份,用于文件系統(tǒng)恢復(fù)。,51,超級(jí)塊結(jié)構(gòu): struct fils
25、ys ushort s_isize;/* 磁盤索引節(jié)點(diǎn)區(qū)所占用的盤塊總數(shù) */ daddr_t s_fsize;/* 整個(gè)文件系統(tǒng)的盤塊總數(shù) */ Short s_nfree;/* 直接管理的空閑塊數(shù)目 */ daddr_t s_freeNICFREE;/* 空閑塊索引表 */ Short s_ninode;/*直接管理的空閑索引節(jié)點(diǎn)數(shù) */ ino_t s_inodeNICINOD; /* 空閑I節(jié)點(diǎn)索引表 */ Char s_flock;/* 處理空閑塊表時(shí)的加鎖標(biāo)志位 */ Char s_ilock; /* 處理空閑I節(jié)點(diǎn)表時(shí)的加鎖標(biāo)志位 */ Char s_fmod;/* 文件系統(tǒng)超級(jí)
26、塊被修改標(biāo)志 */ daddr_t s_tfree;/* 空閑數(shù)據(jù)塊總數(shù) */ ino_t s_tinode;/* 空閑索引節(jié)點(diǎn)總數(shù) */ ,52,空閑索引節(jié)點(diǎn)管理 文件的索引節(jié)點(diǎn)按編號(hào)依次存放在磁盤的I節(jié)點(diǎn)區(qū) 每個(gè)索引節(jié)點(diǎn)存在相應(yīng)的狀態(tài)標(biāo)示:空閑或已分配。 按順序檢索可以發(fā)現(xiàn)空閑節(jié)點(diǎn)。 為加快對(duì)空閑索引節(jié)點(diǎn)的查找 設(shè)置一個(gè)空閑索引節(jié)點(diǎn)棧,保存一部分空閑節(jié)點(diǎn)。 對(duì)索引節(jié)點(diǎn)的申請(qǐng)和釋放,主要在棧中完成。 如果棧為空,會(huì)按順序檢索空閑節(jié)點(diǎn),試圖把棧重新裝滿。 如果棧滿,則直接釋放不再入棧。,53,空閑磁盤塊的管理 所有空閑磁盤塊以多叉(50)樹(shù)的方式組織。 樹(shù)的每個(gè)葉子節(jié)點(diǎn)對(duì)應(yīng)一個(gè)空閑磁盤塊 樹(shù)的
27、每個(gè)中間節(jié)點(diǎn)存儲(chǔ)在一個(gè)空閑磁盤塊中,其內(nèi)容表示下層的多(50)個(gè)磁盤塊號(hào)。,54,圖6-11 空閑文件存儲(chǔ)塊的分組鏈?zhǔn)剿饕?filsys,s_nfree:25 s_free 0 : s_free 24,s_nfree:50 s_free 0:0 s_free 1 : s_free 49,s_nfree:50 s_free 0 : : s_free 49,s_nfree:50 s_free 0 : : s_free 49,55,3-10、UNIX的文件打開(kāi)管理 內(nèi)存中的目錄結(jié)構(gòu)樹(shù) 必要性: 訪問(wèn)一個(gè)文件時(shí),系統(tǒng)要從根目錄或當(dāng)前目錄出發(fā),循序讀取和搜索各級(jí)目錄文件磁盤I節(jié)點(diǎn),索引結(jié)構(gòu)等,找到文件物
28、理塊號(hào)后再存取文件數(shù)據(jù)。 涉及多次磁盤操作,速度慢。 技術(shù)思路: 在內(nèi)存中,保存磁盤上的目錄結(jié)構(gòu)樹(shù)的副本 內(nèi)存中并不是完整的副本,而是一部分: 內(nèi)容容量的限制 根據(jù)局部性原理,保存一部分就能起到很好的效果,56,內(nèi)存索引節(jié)點(diǎn) 存在的必要 文件打開(kāi)后,索引節(jié)點(diǎn)可能被頻繁訪問(wèn),需要提高訪問(wèn)速度。 實(shí)現(xiàn)多文件系統(tǒng)支持的一種技術(shù)手段。 可以擴(kuò)充一些字段,實(shí)現(xiàn)一些動(dòng)態(tài)信息,57,具體結(jié)構(gòu) struct inode struct inod *i_forw; 內(nèi)存I節(jié)點(diǎn)的散列隊(duì)列雙向循環(huán)勾連指針 struct inod *i_back; char i_flag; 狀態(tài)標(biāo)志,如鎖標(biāo)志、修改標(biāo)志等 cnt_t
29、i_count; 引用計(jì)數(shù),表示該文件打開(kāi)了幾次 dev_t i_dev; 文件所在的設(shè)備號(hào) ino_t i_number; 對(duì)應(yīng)的磁盤索引節(jié)點(diǎn)號(hào) struct union daddr_t i_a13; 常規(guī)文件或目錄文件的地址索引表 short i_f26 管道文件的地址索引表 i_p; daddr_t i_l 最近一次讀入的文件邏輯塊,用于預(yù)讀 i_blk;,58,文件控制塊 文件被打開(kāi)一次,就分配一個(gè)相應(yīng)的文件控制塊。主要用于保存文件打開(kāi)后產(chǎn)生一些動(dòng)態(tài)信息。 存在的必要(為何動(dòng)態(tài)信息不存放在內(nèi)存索引節(jié)點(diǎn)中) 內(nèi)存索引節(jié)點(diǎn)主要存在文件相關(guān)的靜態(tài)信息 便于實(shí)現(xiàn)一個(gè)文件同時(shí)被多個(gè)進(jìn)程打開(kāi)。,5
30、9,具體結(jié)構(gòu) struct file char f_flag; 操作方式,如寫、讀、追加寫等 cnt_t f_count; 共享該file結(jié)構(gòu)的進(jìn)程數(shù) union struct inode *f_uinode; 指向內(nèi)存I節(jié)點(diǎn) struct file *f_unext; 空閑file的鏈接指針 f_up; union off_t f_off; 讀寫位置指針 f_un; ;,60,進(jìn)程的打開(kāi)文件表 進(jìn)程打開(kāi)文件表或稱打開(kāi)文件描述字表是進(jìn)程擴(kuò)充控制塊user結(jié)構(gòu)中一個(gè)指針數(shù)組struct file *u_ofileNOFILE 每個(gè)表項(xiàng)指向一個(gè)打開(kāi)的文件(即文件控制塊) 進(jìn)程在打開(kāi)文件時(shí)按下標(biāo)序由
31、低至高順次使用該數(shù)組中的某一空閑項(xiàng),在該表項(xiàng)中填入打開(kāi)文件控制塊file結(jié)構(gòu)變量的地址,打開(kāi)文件描述字的值就是該空閑項(xiàng)的下標(biāo)值 一般情況下,子進(jìn)程繼承父進(jìn)程打開(kāi)的文件。二者的打開(kāi)文件表是相同的。,61,4、文件相關(guān)的系統(tǒng)調(diào)用,4-1、文件創(chuàng)建 Creat:創(chuàng)建一個(gè)新的空文件 調(diào)用格式: fd=creat(char * pathname, int mode); int fd, mode; char *pathname; 參數(shù): Pathname:要?jiǎng)?chuàng)建文件的帶路徑的文件名。 mode是以二進(jìn)制的位值為該文件設(shè)置的存取控制權(quán)限。 低9位以3位為一組,由高至低位分別表示文件主,文件主同組用戶和其他用
32、戶對(duì)該文件是否擁有讀、寫、執(zhí)行權(quán)限。 高三位分別: 粘貼位: 組標(biāo)示控制位 S位,62,返回值: fd中存放文件創(chuàng)建成功后系統(tǒng)返回的整數(shù)值,稱為打開(kāi)文件標(biāo)識(shí)數(shù)(或稱描述字) 如創(chuàng)建失敗,fd為-1 說(shuō)明: 創(chuàng)建成功后,該文件為打開(kāi)狀態(tài),而且是寫狀態(tài)。 若已存在同名文件,如原同名文件可寫,則相當(dāng)于先清空原來(lái)文件的內(nèi)容。,63,4-2、文件打開(kāi) Open:打開(kāi)一個(gè)已經(jīng)存在的文件。在使用文件前都需要打開(kāi)相應(yīng)的文件 調(diào)用格式: fd=open (pathname,flags); int fd, flags; char *pathname 參數(shù)描述: Pathname:所要打開(kāi)文件的文件名(含路徑),6
33、4,Flags:表示打開(kāi)后要對(duì)文件進(jìn)行的操作類型。 O_RDONLY(0) 對(duì)文件進(jìn)行讀操作。 O_WRONLY(1) 對(duì)文件進(jìn)行寫操作。 O_RDWR (2) 對(duì)文件既可以讀也可以寫。 O_NDELAY (4) 打開(kāi)管道文件時(shí)是否要等待。 O_APPEND (8) 對(duì)文件進(jìn)行添加寫操作。 返回值: Fd:整型值,表示文件打開(kāi)標(biāo)示數(shù)(文件描述符) 說(shuō)明: 若文件不存在,且打開(kāi)目的為寫( O_WRONLY ),視O_CREAT的設(shè)置與否,可能會(huì)直接創(chuàng)建一個(gè)文件并打開(kāi)。文件的訪問(wèn)權(quán)限設(shè)置采用默認(rèn)設(shè)置。 若不用默認(rèn)設(shè)置可調(diào)用fd=open (pathname, flags,mode); 文件打開(kāi)后,
34、一般情況:讀寫指針默認(rèn)為0位置。,65,4-3、文件關(guān)閉 Close:關(guān)閉一個(gè)已經(jīng)打開(kāi)的文件 調(diào)用格式: Ret = Close(fd) Int fd,ret 參數(shù): Fd:打開(kāi)文件的文件描述符 返回值: 成功為0 不成功為-1 說(shuō)明: 當(dāng)程序運(yùn)行終止時(shí),操作系統(tǒng)會(huì)關(guān)閉該進(jìn)程打開(kāi)的所有文件,66,4-4、創(chuàng)建文件鏈接 Link:為一個(gè)已經(jīng)存在的文件創(chuàng)建一個(gè)鏈接,相當(dāng)于再起一個(gè)新的文件名 描述 Ret = link(oldname,newname) Int ret Char * oldname,newname 返回值: 0表示成功 -1表示不成功 說(shuō)明: 和Windows下的快捷方式不同,新鏈接
35、一旦創(chuàng)建成功,和原來(lái)的文件名(原鏈接)在沒(méi)有聯(lián)系。不存在新鏈接依賴于舊鏈接的問(wèn)題,67,4-5,刪除文件/鏈接 Unlink:刪除一個(gè)文件連接 描述: Ret = unlink(filename) Int ret Char * filename 返回值: 0表示成功 -1表示不成功 說(shuō)明: 刪除一個(gè)文件鏈接,如果該文件對(duì)應(yīng)的鏈接數(shù)等于1,就直接刪除該文件。,68,4-6、讀文件 Read:從文件中讀數(shù)據(jù) 描述: size = read(fd,buffer,nbytes) Int size, nbytes, fd Char *buffer 參數(shù): Fd:被讀文件的文件描述符 Buffer:從文件
36、中讀出的數(shù)據(jù)放到的緩沖區(qū) Nbytes:希望從文件中讀出的數(shù)據(jù)長(zhǎng)度,字節(jié)數(shù)表示 返回值: 成功讀出的數(shù)據(jù)長(zhǎng)度 如果讀不成功,為-1 說(shuō)明: 讀成功后,fd的讀指針后移相應(yīng)的字節(jié)數(shù)。,69,4-7、寫文件 write:寫數(shù)據(jù)到文件 描述: size = write(fd,buffer,nbytes) Int size, nbytes, fd Char *buffer 參數(shù): Fd:要寫文件的文件描述符 Buffer:把哪個(gè)緩沖區(qū)中的內(nèi)容寫到文件 Nbytes:希望寫的數(shù)據(jù)長(zhǎng)度,字節(jié)數(shù)表示 返回值: 成功寫入的數(shù)據(jù)長(zhǎng)度 如果寫不成功,為-1 說(shuō)明: 寫成功后,fd的寫指針后移相應(yīng)的字節(jié)數(shù)。,70,
37、4-8、三個(gè)特殊文件的讀寫 標(biāo)準(zhǔn)輸入/輸出文件 為便于應(yīng)用程序和標(biāo)準(zhǔn)終端進(jìn)行輸入/輸出,標(biāo)準(zhǔn)終端也以文件的形式存在。而且對(duì)應(yīng)的文件在進(jìn)程創(chuàng)建后就已處于打開(kāi)的狀態(tài)。 0號(hào) 標(biāo)準(zhǔn)讀文件代表鍵盤輸入 1號(hào) 標(biāo)準(zhǔn)寫文件代表屏幕顯示 2號(hào) 標(biāo)準(zhǔn)錯(cuò)誤輸出文件,是程序的運(yùn)行時(shí)的出錯(cuò)信息,寫至屏幕上,71,4-9、調(diào)整文件讀寫指針 Lseek:改變文件的讀寫指針位置,實(shí)現(xiàn)隨機(jī)讀寫 描述: lseek(fd, offset, whence) 參數(shù): Fd:文件描述符 Offset:字節(jié)偏移量 Whence:移動(dòng)方式的參考點(diǎn) 0:參考點(diǎn)為文件頭 1:參考點(diǎn)為當(dāng)前位置 2:參考點(diǎn)為文件末尾 返回值: 文件讀寫指針位
38、置。 說(shuō)明: Whence為0時(shí),offset不能為負(fù)值 Whence為2時(shí),offset不能為正值,72,4-10,創(chuàng)建其他類型文件 Mknod:創(chuàng)建特殊文件,目錄,管道或設(shè)備文件 描述: Int mknod(filename,mode,device) 參數(shù) Filename:要?jiǎng)?chuàng)建文件的文件名 Mode:文件的存取控制屬性 Device:設(shè)備號(hào)(只在創(chuàng)建設(shè)備文件時(shí)有效) 返回值 0:表示成功 -1:表示創(chuàng)建失敗,73,4-11、改變文件的權(quán)限chmod 改變一個(gè)文件或目錄的許可權(quán),調(diào)用格式為 chmod (pathname, mode); char *pathname; int mode;
39、 mode的二進(jìn)制位定義同creat系統(tǒng)調(diào)用。,74,4-12、復(fù)制文件描述字dup 為一個(gè)已打開(kāi)的文件再分配一個(gè)新的文件描述字,使多個(gè)文件描述字可與同一個(gè)文件相聯(lián)系,在構(gòu)造shell的管道線時(shí)這個(gè)調(diào)用很重要。調(diào)用格式為 newfd=dup (fd); int fd, newfd; 執(zhí)行本調(diào)用時(shí),核心為已打開(kāi)的文件fd在打 開(kāi)文件表中再分配可用的文件描述字,并返回給執(zhí)行進(jìn)程。,75,4-13、查詢文件的狀態(tài)stat與fstat 返回文件的類型、大小、所有者、存取權(quán)限,聯(lián)接數(shù)等信息。這些信息是從文件的索引節(jié)點(diǎn)中讀出來(lái)的。調(diào)用格式有兩種: stat (pathname, buf); fstat (
40、fd, buf); char *pathname; struct stat *buf; int fd; 前一個(gè)調(diào)用所指文件是以UNIX的路徑名形式給出,因此能返回文件系統(tǒng)中存在文件的狀態(tài),后一個(gè)調(diào)用是以文件描述字的形式給出,故只能用于已打開(kāi)的文件。后一種調(diào)用執(zhí)行的速度要比前一種快。返回的文件狀態(tài)存放在stat類型的結(jié)構(gòu)中。,76,4-14、對(duì)已打開(kāi)的文件進(jìn)行控制 fcntl (fd, cmd, arg); int fd, cmd, arg; cmd為對(duì)文件的控制模式,77,4-15、設(shè)置權(quán)限屏蔽字 umask調(diào)用可以設(shè)置或改變進(jìn)程所創(chuàng)建文件的屏蔽字 格式:umask(mode) 說(shuō)明: 如果在
41、該調(diào)用后,進(jìn)程創(chuàng)建文件時(shí),如果沒(méi)有明確指明文件初始權(quán)限模式,就用該調(diào)用設(shè)置的模式 如果在open調(diào)用中,已經(jīng)明確了權(quán)限模式,則該設(shè)置對(duì)這次文件創(chuàng)建不起作用。,78,4-16、目錄文件的讀操作 Open可以打開(kāi)一個(gè)目錄文件 獲取目錄文件中的目錄項(xiàng) Int getdents(int fd, struct dirent *dirp, int count),79,5、文件相關(guān)的標(biāo)準(zhǔn)I/O庫(kù),5-1、標(biāo)準(zhǔn)I/O庫(kù)的存在背景 完成文件基本操作的系統(tǒng)調(diào)用提供的只是字節(jié)序列方式的最基本的功能,不能完成任何格式轉(zhuǎn)化。使用起來(lái)相對(duì)而言比較麻煩 不便于實(shí)現(xiàn)源程序之間的移植。實(shí)際上,兩個(gè)OS比較難以在系統(tǒng)調(diào)用界面上實(shí)
42、現(xiàn)完全兼容。 5-2、標(biāo)準(zhǔn)I/O庫(kù)的實(shí)現(xiàn)思路 在源程序和系統(tǒng)調(diào)用層之間實(shí)現(xiàn)一層文件操作相關(guān)的庫(kù),用于實(shí)現(xiàn)對(duì)系統(tǒng)調(diào)用的封裝。,80,5-3、標(biāo)準(zhǔn)I/O庫(kù)的主要功能 為了提供功能更強(qiáng)和使用更方便的輸入和輸出操作。 通過(guò)用戶態(tài)空間的自動(dòng)緩沖機(jī)構(gòu)以及數(shù)據(jù)類型轉(zhuǎn)化和格式化的輸入輸出,提供了效率高、功能強(qiáng)和可移植的文件訪問(wèn)或字符串處理功能 通過(guò)一個(gè)FILE類型結(jié)構(gòu)建立與打開(kāi)文件的聯(lián)系,稱為流(stream),81,5-4、流文件的大致實(shí)現(xiàn) 結(jié)構(gòu): typedef struct _iobuf unsigned char *_ptr;緩沖區(qū)內(nèi)下一字符地址 int _cnt;緩沖區(qū)中_ptr所指位置后剩余字符數(shù)
43、 unsigned char *_base;緩沖區(qū)起始地址 char _flag;存取方式,如讀或/和寫 char _file;文件描述字 FILE; file用于存放打開(kāi)文件的描述字 寫操作:輸入的字節(jié)數(shù)據(jù)逐個(gè)放入緩沖區(qū)中,并相應(yīng)地調(diào)整_ptr和_cnt之值。如果緩沖區(qū)存滿了,例行程序再通過(guò)系統(tǒng)調(diào)用write把緩沖區(qū)內(nèi)容寫入_file指示的文件中。 讀操作:從緩沖區(qū)中讀數(shù)據(jù),當(dāng)緩沖區(qū)空了時(shí),就通過(guò)系統(tǒng)調(diào)用read從文件中再讀入一個(gè)緩沖區(qū)的數(shù)據(jù)。,82,圖6-3流文件操作與系統(tǒng)調(diào)用間的關(guān)系,用 戶 態(tài) 與 核 心 態(tài) 切 換,用戶程序,標(biāo)準(zhǔn)I/O庫(kù),核心程序,流文件操作,用戶態(tài)空間,核心態(tài)空間
44、,塊設(shè)備 讀寫,塊設(shè)備 驅(qū)動(dòng),系統(tǒng)調(diào)用,用戶 程序,fread ( ) fwrite ( ),文件 卷,用戶態(tài) 緩沖區(qū),read ( ) write ( ),核心態(tài) 緩沖區(qū),83,5-5、流文件打開(kāi) 使用描述 FILE *fp; fp=fopen (pathname, type); char *pathname, *type; 參數(shù): Pathname:文件名 Type:打開(kāi)方式。 r 打開(kāi)文件用于只讀。 w 建立文件或把已存在文件截為空文件,用于只寫。 a 打開(kāi)文件用于文件尾的追加寫。 說(shuō)明: 如果打開(kāi)成功,把它與一個(gè)流聯(lián)系起來(lái),并返回標(biāo)識(shí)該流的FILE結(jié)構(gòu)的指針。如fopen失敗,返回NU
45、LL。參數(shù)type可取下列的基本值: 與0#,1#,2#三個(gè)標(biāo)準(zhǔn)的打開(kāi)文件描述字相聯(lián)系,標(biāo)準(zhǔn)I/O庫(kù)提供了三個(gè)不需要打開(kāi)的流,并用下列的FILE指針標(biāo)識(shí): stdin標(biāo)準(zhǔn)輸入流 stdout標(biāo)準(zhǔn)輸出流 stderr錯(cuò)誤輸出流,84,5-6、流文件關(guān)閉 使用描述 fclose(fp); 功能說(shuō)明: 該命令刷新與文件相關(guān)的緩沖區(qū),關(guān)閉已打開(kāi)的文件并釋放FILE結(jié)構(gòu)。如果不顯式執(zhí)行該命令,進(jìn)程運(yùn)行結(jié)束后關(guān)閉所有打開(kāi)的流文件。,85,5-7、流文件讀寫 使用描述: n=fread(buf,size,nitems,fp); n=fwrite(buf,size,nitems,fp); int n,size
46、,nitems; char *buf; FILE *fp; 功能描述: fread從fp指定的輸入流文件中將nitems個(gè)大小為size的數(shù)據(jù)對(duì)象讀入buf所指向的存儲(chǔ)區(qū)中,返回值n給出了成功讀出的數(shù)據(jù)對(duì)象個(gè)數(shù)。 fwrite將nitems個(gè)大小為size的數(shù)據(jù)對(duì)象從buf所指的存儲(chǔ)區(qū)寫到fp所指定的輸出流文件中。返回值n給出了實(shí)際寫入的數(shù)據(jù)對(duì)象個(gè)數(shù)。 其他說(shuō)明 fread與fwrite是二進(jìn)制數(shù)據(jù)的讀寫方法 與具體機(jī)器的數(shù)據(jù)內(nèi)部存儲(chǔ)方法(如一個(gè)字的高、低位字節(jié)次序)有關(guān),86,5-8、流文件讀寫效率分析 對(duì)比舉例: 循環(huán)write (fd, buf, 1) 循環(huán)fwrite (buf, 1,
47、 1, fp) 分析: 前者,每寫一次都需要完成一次系統(tǒng)調(diào)用。 后者,每執(zhí)行一次往庫(kù)緩沖區(qū)中寫一個(gè)字節(jié),待緩沖區(qū)寫滿后,才執(zhí)行系統(tǒng)調(diào)用完成數(shù)據(jù)寫(所有緩沖區(qū)的內(nèi)容) 結(jié)論: 由于前者要頻繁切換系統(tǒng)狀態(tài)(核心態(tài)和用戶態(tài)),因此后者的效率在這種情況下要高得多,87,5-9、調(diào)整和獲得流文件的讀寫位置 使用描述: fseek (fp, offset, whence); rewind (fp); position = ftell (fp); FILE *fp; long offset, position; int whence; 功能說(shuō)明: rewind將文件讀寫位置指針調(diào)整到文件頭 ftell返回流
48、中的當(dāng)前位置 fseek同lseek功能類似,只是針對(duì)流文件。,88,5-10、格式化輸入/輸出 特征對(duì)比 二進(jìn)制I/O與機(jī)器特征有關(guān),需要用戶熟悉機(jī)器特征并進(jìn)行正確解析 格式化I/O可以由庫(kù)函數(shù)直接完成相應(yīng)的解析 使用格式1: fscanf (fp, format , arg1, arg2, argn ); fprintf (fp, format , arg1, arg2, argn ); FILE *fp; char *format; 使用格式2:直接同終端I/O scanf (format , arg1, arg2, argn ); printf (format , arg1, arg2
49、, argn ); char *format;,89,5-11、單字符I/O 每次只要從流文件中讀入一個(gè)字符或向流文件中輸出一個(gè)字符 使用描述1: c = fgetc (fp) 和 fputc (c, fp) char c; FILE *fp;,90,使用描述2: c = getc (stdin); putc (c, stdout); 使用描述3: c = getchar( ); putchar(c); 使用描述:回退剛剛輸入的一個(gè)字符 ungetc(c, fp); char c; FILE *fp;,91,5-12、行輸入/輸出 使用描述1: retstring = fgets(buf, s
50、ize, fp); fputs(string, fp); char *buf, *retsting, *string; int size; FILE *fp; 使用描述2:標(biāo)準(zhǔn)I/O gets(buf) Put(buf) 說(shuō)明 fgets從流fp中讀字符,直至讀到換行符或文件結(jié)束,但一次最多讀size個(gè)字符。讀出的字符連同換行符存入緩沖區(qū)buf中。返回指向buf的指針。 fputs將一行字符串string寫入流文件fp中。,92,5-13、存儲(chǔ)區(qū)格式化 使用描述: sscanf (buf, format, arg1 , arg2, , argn); sprintf (buf, format ,
51、 arg1, arg2, , argn); char *buf, *format; 描述: sscanf函數(shù)中各個(gè)參數(shù)所需的值不是從終端或文件中輸入,而是取自緩沖區(qū)buf中。 sprintf函數(shù)則將各個(gè)參數(shù)的值存入緩沖區(qū)buf中 格式說(shuō)明串format則規(guī)定了數(shù)據(jù)傳送時(shí)的格式變換,93,5-14、程序執(zhí)行 使用描述: retval = system (command); char *command; int retval; 說(shuō)明: 先創(chuàng)建一個(gè)子進(jìn)程,然后讓子進(jìn)程改換自己的圖像 并由shell 執(zhí)行參數(shù)所指定的命令 主進(jìn)程等待子進(jìn)程執(zhí)行完之后,再繼續(xù)執(zhí)行。,94,6、管道文件和通信,6-1、管道
52、的基本概念 一種進(jìn)程間的通信方式。 能夠在進(jìn)程間傳遞大量的順序信息:像一隊(duì)列,一進(jìn)程在尾部順序?qū)憯?shù)據(jù),另一進(jìn)程從頭部順序讀數(shù)據(jù)。 數(shù)據(jù)的寫入和讀出以先進(jìn)先出的方式進(jìn)行,并由系統(tǒng)自動(dòng)地處理兩個(gè)進(jìn)程間的調(diào)度、同步和數(shù)據(jù)緩沖,這類文件就稱為管道(pipe)文件,簡(jiǎn)稱管道,或稱FIFO 讀、寫的具體方式和讀寫文件沒(méi)有任何區(qū)別。 對(duì)上層用戶而言,管道分為兩個(gè)級(jí)別: 操作系統(tǒng)級(jí):同時(shí)執(zhí)行的兩個(gè)進(jìn)程進(jìn)行通信 Shell命令級(jí):ls | more,95,6-2、無(wú)名管道的創(chuàng)建 使用系統(tǒng)調(diào)用pipe創(chuàng)建。 只能在與創(chuàng)建pipe的進(jìn)程同一進(jìn)程族內(nèi)傳遞數(shù)據(jù),常用于父子進(jìn)程間的通信 具體方法: int fd2,ret
53、v; retv=pipe(fd);,96,6-3、無(wú)名管道的實(shí)現(xiàn) 創(chuàng)建管道時(shí),核心首先為其在管道設(shè)備文件系統(tǒng)中分配一個(gè)磁盤I節(jié)點(diǎn)和一個(gè)相應(yīng)的內(nèi)存I節(jié)點(diǎn) 再分配兩個(gè)分別用于讀打開(kāi)和寫打開(kāi)的file結(jié)構(gòu) 進(jìn)程打開(kāi)表中分配兩個(gè)文件描述字表項(xiàng),一個(gè)指向讀打開(kāi)file結(jié)構(gòu),一個(gè)指向?qū)懘蜷_(kāi)file結(jié)構(gòu),其中,在fd0中返回的是讀端文件描述字,在fd1中返回的是寫端文件描述字。,fd 0,fd 1,讀數(shù)據(jù),寫數(shù)據(jù),97,6-4、無(wú)名管道的讀寫 管道創(chuàng)建后,就可以通過(guò)兩個(gè)fd進(jìn)行讀寫來(lái)完成通信。一般情況下,通過(guò)一個(gè)(或多個(gè))進(jìn)程寫,另一個(gè)(或多個(gè))進(jìn)程讀。 管道類似于循環(huán)緩沖區(qū),其長(zhǎng)度最大為10個(gè)磁盤塊的大小
54、。 初始時(shí),讀指針和寫指針都在零位置。 每當(dāng)有數(shù)據(jù)寫入時(shí),寫指針自動(dòng)增加,整個(gè)緩沖寫滿后就不能再寫。 每當(dāng)有數(shù)據(jù)讀出時(shí),讀指針自動(dòng)增加。讀指針不能超過(guò)寫指針,趕上寫指針時(shí)表示沒(méi)有東西可讀。,98,i_frptr,i_fwptr,9,0,圖6-13 循環(huán)隊(duì)列機(jī)構(gòu)的管道,99,6-5、無(wú)名管道的關(guān)閉 無(wú)名管道的關(guān)閉和關(guān)閉普通文件沒(méi)有區(qū)別。 如果兩個(gè)進(jìn)程同時(shí)對(duì)一管道進(jìn)行寫/讀,那么在一個(gè)進(jìn)程中關(guān)閉fd1/fd0,并不影響另外一個(gè)進(jìn)程。 如果所有的寫進(jìn)程關(guān)閉,表示該管道關(guān)閉。核心將喚醒所有等待讀的進(jìn)程。 如果所有的讀進(jìn)程關(guān)閉,表示該管道關(guān)閉。核心通過(guò)信號(hào)告知寫進(jìn)程。,100,6-6、無(wú)名管道的應(yīng)用實(shí)例
55、:父進(jìn)程向子進(jìn)程傳遞信息 main ( ) char *msg = A message from parent. int chan 2; char buf 100; pipe (chan); if (fork ( ) close (chan 0);/* 父進(jìn)程關(guān)閉管道讀端 */ write (chan 1, msg, strlen (msg)+1); /* 寫管道 */ close (chan 1); else close (chan 1); read (chan 0, buf, strlen (msg)+1) /* 子進(jìn)程讀管道 */ printf (Child Proedss:% sn, buf); close (chan 0); ,101,6-7、有名管道的概念 無(wú)名管道的通信特點(diǎn) 只便于在一組進(jìn)程間進(jìn)行通信。常用于父子進(jìn)程。 無(wú)名管道是動(dòng)態(tài)的,通信的進(jìn)程要同時(shí)存在。 在文件系統(tǒng)中,不長(zhǎng)久存在。 有名管道: 緩沖區(qū)在磁盤上有副本,類似于臨時(shí)文件,在磁盤上存在相應(yīng)的I節(jié)點(diǎn)和目錄項(xiàng),也有文件名和路徑名。 象普通文件一樣是靜態(tài)的,需要?jiǎng)?chuàng)建和刪除 管道的基本特征仍然存在:FIFO 有名管道類似于只支持FIFO讀寫方式的特殊文
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高職第三學(xué)年(信息安全技術(shù))信息安全防護(hù)2026年綜合測(cè)試題及答案
- 2026年甘肅能源化工職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)筆試模擬試題帶答案解析
- 2026年廣東工程職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性考試備考題庫(kù)有答案解析
- 土地使用權(quán)轉(zhuǎn)讓合同協(xié)議(2025年土地使用)
- 2026年廣州鐵路職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)筆試模擬試題帶答案解析
- 2026年鞍山職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試參考題庫(kù)帶答案解析
- 2026年紅河衛(wèi)生職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能筆試模擬試題帶答案解析
- 2026年德宏師范高等專科學(xué)校單招綜合素質(zhì)筆試模擬試題帶答案解析
- 2026年長(zhǎng)沙環(huán)境保護(hù)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試模擬試題附答案詳解
- 2026年白銀礦冶職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能筆試模擬試題帶答案解析
- DZ∕T 0274-2015 地質(zhì)數(shù)據(jù)庫(kù)建設(shè)規(guī)范的結(jié)構(gòu)與編寫(正式版)
- 失智老人護(hù)理計(jì)劃
- 啟明星籃球培訓(xùn)學(xué)校運(yùn)營(yíng)管理手冊(cè)
- 同位素示蹤技術(shù)與應(yīng)用
- 2022-2023學(xué)年廣東省東莞市九年級(jí)(上)期末數(shù)學(xué)試卷(含解析)
- GB/T 9581-2011炭黑原料油乙烯焦油
- GB/T 18991-2003冷熱水系統(tǒng)用熱塑性塑料管材和管件
- FZ/T 50047-2019聚酰亞胺纖維耐熱、耐紫外光輻射及耐酸性能試驗(yàn)方法
- 市政道路施工總進(jìn)度計(jì)劃表
- (更新版)國(guó)家開(kāi)放大學(xué)電大《機(jī)械制造基礎(chǔ)》機(jī)考網(wǎng)考題庫(kù)和答案
- 2023年新疆文化旅游投資集團(tuán)有限公司招聘筆試模擬試題及答案解析
評(píng)論
0/150
提交評(píng)論