国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

文件系統和不同格式文件轉換編程

2019-11-17 05:31:54
字體:
來源:轉載
供稿:網友

  一、linux 的文件系統概述
 
   Linux 的一個最重要特點就是它支持許多不同的文件系統。這使Linux 非常靈活,能夠與許多其他的操作系統共存。到目前為止,Linux 共支持1 5 種文件系統:ext、ext2xia、minix、umsdos、msdos、vfat、PRoc、smb、ncp、iso9660、sysv、hpfs、affs和ufs。無疑隨著時間的推移,Linux支持的文件系統數還會增加。
   正如其它的UNIX操作系統 一樣,Linux系統可用的獨立文件系統不是通過設備標識來訪問的,而是把它們鏈接到一個單獨的樹形層次結構中。該樹形層次結構把文件系統表示成一個整個的獨立實體。Linux 以裝配的形式把每個新的文件系統加入到這個單獨的文件系統樹中。無論什么類型的文件系統,都被裝配到某個目錄上,由被裝配的文件系統的文件覆蓋該目錄原有的內容。該個目錄被稱為裝配目錄或裝配點。在文件系統卸載時,裝配目錄中原有的文件才會顯露出來。
   在硬盤初始化時,硬盤上的分區結構把物理硬盤化分成若干個邏輯分區。每個分區可以包含一個像EXT2那樣的一個獨立的文件系統。文件系統用目錄將文件按照邏輯層次結構組織起來。目錄是記錄在物理設備塊中的軟鏈接信息。包含文件系統的設備被稱為塊設備。例如IDE硬盤分區/dev/hda1-系統中第一個IDE硬盤驅動器的第一個分區,就是一個塊設備。
   Linux文件系統把這些塊設備當作簡單的線性塊的集合,它不知道也不在意下層物理硬盤的實際結構。每個塊設備驅動程序的任務就是把系統讀該設備上某一塊的請求映射成對本設備有意義的術語,如該塊所在的磁道、扇區或柱面號。無論文件系統存在在何種設備上,它都可以按相同的方式進行操作。而且在使用文件系統時,由不同的硬件控制器控制的不同物理介質上的不同文件系統對系統用戶是透明的。文件系統既可能在本地系統上的,也可能是通過網絡鏈接裝配的遠程文件系統。
   文件是數據的集合,一個文件系統不僅包括該文件系統中所有文件的數據,還包括文件系統的結構信息。它記錄下所有Linux用戶和進程當作文件看待的信息、目錄軟鏈接信息以及文件保護信息等等。而且文件系統必需保證這些信息的安全性,因為操作系統的基本完整性就取決于它的文件系統。沒有人會使用一個隨時會丟失數據和文件的操作系統。 由于現代的數據庫系統需要更大的文件長度,在1993年幾乎是為LINUX度身定做的擴展文件系統-EXT2誕生了。在EXT文件系統加入到Linux中時,Linux系統發生了一個重大的發展。真實文件系統從操作系統中分離出來,而由一個接口層提供的真實文件系統的系統服務被稱為虛擬文件系統(VFS)。VFS使得Linux可以支持許多種不同的文件系統,而這些文件系統都向VFS提供相同的軟件接口。由于所有的Linux文件系統的細節都是由軟件進行轉換的,所有對Linux系統的其余部分和在系統中運行的程序來說,這些文件系統是完全相同的。Linux的虛擬文件系統層使得你可以同時透明地裝配很多不同的文件系統。
   實現Linux虛擬文件系統要使得它對文件的訪問要盡可能地快、盡可能地高效,而且一定要確保文件和數據的正確性。這兩個要求彼此是不對稱的。在每個文件系統被裝配使用后,Linux的VFS會在內存中緩存來自于這些文件系統的信息。因此由于對文件或目錄的創建、寫、刪除操作而改變了Linux緩存中的數據時,對文件系統的更新操作要格外小心。假如你能在運行的內核中看到文件系統的數據結構,就會看到那些文件系統讀/寫的數據塊。代表被訪問的文件和目錄的數據結構可能被創建或刪除,而設備驅動程序不停地工作,讀取數據、保存數據。這些緩存中最重要的一個是緩沖區緩存,它把獨立文件系統訪問下層塊設備的方法集成起來。每個被訪問的塊都被放到緩沖區緩存中,并根據它們的狀態放在相應的隊列中。緩沖區緩存不僅緩存數據緩沖區,它還有助于治理塊設備驅動程序的異步接口。

二、LINUX文件系統代碼的位置

   EXT2文件系統的代碼都在fs/ext2/目錄下,其數據結構定義在include/linux/ex2_fs.h、ext2_fs_i.h和ext2_fs_sb.h中;虛文件系統(Virtual File System)數據結構在include/linux/fs.h中,代碼在fs/*中;緩沖區緩存代碼在fs/buffer.c中。

三、與文件的輸入/輸出有關的函數

3.1 引言

   本節開始討論LINUX系統,先說明常用的文件I/O函數:例如打開文件、讀文件、寫文件等等。
   大多數LINUX文件I/O只需用到5個函數:open、read、write、lseek 以及close。然后說明不同緩存器長度對read 和write函數的影響。本節所說明的函數經常被稱之為不帶緩存的I/O(unbuffered I/O)。不帶緩存指的是每個read 和write都調用內核中的一個系統調用。這些不帶緩存的I/O函數不是ANSI C 的組成部分,但是是POSIX.1和XPG3的組成部分。只要涉及在多個進程間共享資源,原子操作的概念就變成非常重要。我們將通過文件I/O和傳送給open函數的參數來討論此概念。并進一步討論在多個進程間如何共享文件,并涉及內核的有關數據結構。在討論了這些特征后,將說明dup、fcntl和ioctl函數。


3.2 文件描述符
 
   對于內核而言,所有打開文件都由文件描述符引用。文件描述符是一個非負整數。當打開一個現存文件或創建一個新文件時,內核向進程返回一個文件描述符。當讀、寫一個文件時,用open或creat返回的文件描述符標識該文件,將其作為參數傳送給read或write。按照慣例,UNIX shell使文件描述符0與進程的標準輸入相結合,文件描述符1與標準輸出相結合,文件描述符2與標準出錯輸出相結合。這是UNIX shell以及很多應用程序使用的慣例,而與內核無關。盡管如此,假如不遵照這種慣例,那么很多LINUX應用程序就不能工作。在POSIX.1應用程序中,幻數0、1、2應被代換成符號常數STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO。這些常數都定義在頭文<unistd.h>中。文件描述符的范圍是0~OPEN_MAX(見表2-7)。早期的LINUX版本采用的上限值是19(答應每個進程打開20個文件),現在很多系統則將其增加至63 。

3.3 open 函數

   調用open函數可以打開或創建一個文件。例如:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname,int oflag,.../*,mode_t mode*/) ;
返回:若成功為文件描述符,若出錯為-1

   我們將第三個參數寫為. . .,這是ANSI C 說明余下參數的數目和類型可以變化的方法。對于open 函數而言,僅當創建新文件時才使用第三個參數。在函數原型中此參數放置在注釋中。pathname是要打開或創建的文件的名字。oflag參數可用來說明此函數的多個選擇項。用下列一個或多個常數進行或運算構成oflag參數(這些常數定義在<fcntl.h>頭文件中):
o O_RDONLY 只讀打開。
o O_WRONLY 只寫打開。
o O_RDWR 讀、寫打開。

3.4 creat 函數

   creat函數用來創建一個新文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int creat(const char *pathname, mode_t mode) ;
返回:若成功為只寫打開的文件描述符,若出錯為-1

   此函數等效于:open(pathname,O_WRONLY |O_CREAT|O_TRUNC,mode) ;在早期的UNIX版本中,open的第二個參數只能是0、1或2。沒有辦法打開一個尚未存在的文件,因此需要另一個系統調用creat以創建新文件。現在,open函數提供了選擇項O_CREAT和O_TRUNC,于是也就不再需要creat函數了。
   creat的一個不足之處是它以只寫方式打開所創建的文件。在提供open的新版本之前,假如要創建一個臨時文件,并要先寫該文件,然后又讀該文件,則必須先調用creat,close,然后再調用open。現在則可用下列方式調用open:
   open(pathname,O_RDWR |O_CREAT|O_TRUNC, mode) ;

3.5 close 函數

   close函數用于關閉一個打開文件:
#include <unistd.h>
int close (int filedes);
返回:若成功為0 ,若出錯為-1
   關閉一個文件時也會釋放該進程加在該文件上的所有記錄鎖。當一個進程終止時,它所有的打開文件都由內核自動關閉。很多程序都使用這一功能而不顯式地用close關閉打開的文件。

3.6 lseek 函數
 
   每個打開文件都有一個與其相關聯的"當前文件位移量"。它是一個非負整數,用以度量從文件開始處計算的字節數。(本節稍后將對"非負"這一修飾詞的某些例外進行說明。)通常,讀、寫操作都從當前文件位移量處開始,并使位移量增加所讀或寫的字節數。按系統默認,當打開一個文件時,除非指定O_APPEND選擇項,否則該位移量被設置為0。
可以調用l s e e k 顯式地定位一個打開文件。
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int f i l e d e s, off_t o f f s e t, int w h e n c e) ;
返回:若成功為新的文件位移,若出錯為-1
   對參數offset 的解釋與參數w h e n c e 的值有關:
o 若whence是SEEK_SET,則將該文件的位移量設置為距文件開始處offset 個字節。
o 若whence是SEEK_CUR,則將該文件的位移量設置為其當前值加offset, offset 可為正或負。
o 若whence是SEEK_END,則將該文件的位移量設置為文件長度加offset, offset 可為正或負。
   若lseek成功執行,則返回新的文件位移量,為此可以用下列方式確定一個打開文件的當前位

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长寿区| 黔东| 鄱阳县| 桂平市| 莱芜市| 株洲市| 惠安县| 扬州市| 恩施市| 丰县| 禄丰县| 呼玛县| 金华市| 舞钢市| 神木县| 山阴县| 二连浩特市| 彭阳县| 武邑县| 贡山| 潮安县| 南充市| 惠来县| 安泽县| 明光市| 承德市| 白银市| 曲水县| 桓仁| 宁乡县| 珠海市| 磐安县| 广饶县| 通城县| 固镇县| 石柱| 江安县| 杭锦后旗| 兴化市| 普宁市| 边坝县|