chapter03 Linux下的文件編程.ppt_第1頁
chapter03 Linux下的文件編程.ppt_第2頁
chapter03 Linux下的文件編程.ppt_第3頁
chapter03 Linux下的文件編程.ppt_第4頁
chapter03 Linux下的文件編程.ppt_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、重點內(nèi)容: 文件概述 文件I/O操作 文件高級操作,第3章 Linux下的文件編程,注:在C編程環(huán)境中,與文件有關(guān)的操作主要是I/O操作, 即基于文件描述符的I/O操作。,一、文件概述,Linux的文件是個簡單的字節(jié)序列。文件是由一系列塊(block)組成,每個塊可能含有512、1024、2048或4096個字節(jié),具體由系統(tǒng)實現(xiàn)決定。不同的文件系統(tǒng)的塊大小可以不同,但同一個文件系統(tǒng)的塊大小是相同的。 Linux的文件系統(tǒng)通常由4部分組成:引導塊、超級塊、索引節(jié)點表(innode table)和數(shù)據(jù)塊)。,一、文件概述,超級塊用于描述一個文件系統(tǒng)的資源狀態(tài),如:文件系統(tǒng)的大小、空閑空間位置信息。

2、超級塊由如下字段構(gòu)成: -文件系統(tǒng)的規(guī)模(如inode數(shù)目、數(shù)據(jù)塊數(shù)目、保留塊數(shù)目和塊的大小等)。 -文件系統(tǒng)中空閑塊的數(shù)目。 -文件系統(tǒng)中部分可用的空閑塊表。 -空閑塊表中下一個空閑塊號。 -索引節(jié)點表的大小。 -文件系統(tǒng)中空閑索引節(jié)點表數(shù)目。 -文件系統(tǒng)中部分空閑索引節(jié)點表。 -空閑索引節(jié)點表中下一個空閑索引節(jié)點號。 -超級塊的鎖字段。 -空閑塊表的鎖字段和空閑索引節(jié)點的鎖字段。 -超級塊是否被修改的標志。 -其他字段。,1、超級塊,一、文件概述,索引節(jié)點(inode)是Linux文件系統(tǒng)的最基本的概念。一個文件的控制信息通常由inode給出,每個inode對應(yīng)著一個文件。在inode中包

3、含有文件數(shù)據(jù)在磁盤上存儲的位置信息,還包含有存取權(quán)限、文件所有者即存取時間等信息。索引節(jié)點(inode)存儲在磁盤上。 磁盤索引節(jié)點和內(nèi)存索引節(jié)點。 磁盤索引節(jié)點由如下字段構(gòu)成: -文件類型:文件可以是普通文件、目錄文件、鏈接文件、設(shè)備文件、管道文件。 -文件鏈接數(shù):記錄了引用該文件的目錄表項數(shù)。 -文件屬主標識:指出該文件的所有者id。 -文件屬主的組標識:指出該文件所有者屬組的id。 -文件的訪問權(quán)限:系統(tǒng)將用戶分為文件屬主、同組用戶和其它用戶三類。 -文件的存取時間:包括文件最后一次被修改的時間、最后一次被訪問的時間和最后一次修改索引節(jié)點的時間。 -文件的長度:以字節(jié)表示的文件長度。 -

4、文件的數(shù)據(jù)塊指針:對文件操作的當前位置指針。,2、索引節(jié)點(inode),一、文件概述,(1)普通文件 也稱正規(guī)文件,是最常見的一類文件,也是最常使用到的一類文件。這種類型的文件按其內(nèi)部結(jié)構(gòu)又可細分為兩個文件類型:文本文件和二進制文件。 (2)目錄文件 Linux文件系統(tǒng)的目錄是一種文件,在文件名與索引節(jié)點之間的轉(zhuǎn)換起到橋梁作用,是樹形文件結(jié)構(gòu)關(guān)鍵。Linux的目錄文件其實非常簡單,它的主要內(nèi)容只有2項:文件名和索引節(jié)點號。 (3)鏈接文件 鏈接文件是一種特殊的文件。它實際上是指向一個真實存在的文件的鏈接。 (4)設(shè)備文件 設(shè)備文件是Linux中最特殊的文件。正是由于它的存在,使得Linux系

5、統(tǒng)可以十分方便的訪問外部設(shè)備。 主設(shè)備號和次設(shè)備號。塊設(shè)備文件和字符設(shè)備文件。(根據(jù)訪問數(shù)據(jù)方式的不同) (5)管道文件 管道文件也是一種很特殊的文件。主要用于不同進程間的信息傳遞。,3、文件類型,二、文件描述符,對于Linux而言,所有對設(shè)備和文件的操作都使用文件描述符來進行。文件描述符是一個非負的整數(shù),表示為int類型的對象,它是一個索引值,并指向內(nèi)核中每個進程打開文件的記錄表。當打開一個現(xiàn)存文件或創(chuàng)建一個新文件時,內(nèi)核就向進程返回一個文件描述符。當需要讀寫文件時,也需要把文件描述符作為參數(shù)傳遞給相應(yīng)的函數(shù)。 每個進程都可以擁有若干文件描述符,數(shù)量多少則依賴于操作系統(tǒng)的實現(xiàn),Linux中的

6、每個進程可以有1024個文件描述符。每個進程有自己的用戶描述符表。文件描述符表的前三項對于一般的進程是固定的且是由系統(tǒng)自動打開的。文件描述符0是標準輸入文件,對于一般進程來說是鍵盤;文件描述符1是標準輸出文件,一般是輸出到顯示器;文件描述符2是標準錯誤輸出文件,一般也是輸出到屏幕。用戶程序不用執(zhí)行打開操作就可直接使用。文件描述符0、1、2對應(yīng)的符號常量分別是STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,它們都定義在頭文件中。,三、文件基本I/O操作,調(diào)用open函數(shù)可以打開或創(chuàng)建一個文件,open是進程存取一個文件中的數(shù)據(jù)必須首先完成的系統(tǒng)調(diào)用。open函數(shù)

7、的格式如下: int open(const char *pathname,int flags, /* mode_t mode */); open函數(shù)打開一個文件并返回一個文件描述符。open函數(shù)中的第1個參數(shù)pathname是要打開(或要創(chuàng)建)的文件名或含路徑的文件名。第2個參數(shù)flags是標志打開的方式,可以是O_RDONLY表示請求以只讀方式打開文件,O_WRONLY表示請求以只寫的方式打開文件,O_RDWR表示以可讀寫的方式打開文件。對一個已經(jīng)存在的文件,在打開它時還要注意它的存取權(quán)限。假設(shè)用戶user是file1文件的擁有者,file1文件的存取權(quán)限被設(shè)為-r-xrr-,這表明user

8、只有讀和執(zhí)行的權(quán)力,如果用戶user要對文件file1做open(“file1”,O_RDWR)操作時,會返回錯誤,因為用戶沒有寫該文件的權(quán)限。 open函數(shù)成功打開將返回一個文件描述符,在隨后對文件的所有操作中將使用這個文件描述符。 open函數(shù)打開失敗時返回-1。,1、open函數(shù),三、基本文件I/O操作,close函數(shù)用來關(guān)閉不再使用的文件,close函數(shù)的格式如下: #include int close(int fd); 其中,fd是文件描述符,它可以通過open、pipe、dup等函數(shù)取得。close如果執(zhí)行成功,返回值為0,否則返回值為-1。,2、close函數(shù),三、基本文件I/O

9、操作,read函數(shù)是從文件中讀取指定長度的數(shù)據(jù)到內(nèi)存中,其格式如下: ssize_t read(int fd, void *buf, size_t count); read函數(shù)的第1個參數(shù)是文件描述符,第2個參數(shù)是輸入緩沖區(qū)指針,第3個參數(shù)是要讀入的字節(jié)數(shù),數(shù)據(jù)類型size_t為unsigned int,是一個類型別名。read函數(shù)的功能是從文件描述符所指定的文件中讀取count個字節(jié)到buf所指向的內(nèi)存緩沖區(qū)中。如果count參數(shù)為0,該系統(tǒng)調(diào)用返回0并且沒有其他結(jié)果。如果count大于SSIZE_MAX,則結(jié)果不能確定。這里提到的SSIZE_MAX在POSIX中是32767。 當read函

10、數(shù)執(zhí)行成功時,該函數(shù)的返回值是讀取的字節(jié)數(shù),返回0表示文件指針在文件尾。成功讀取一定字符數(shù)返回時,文件指針也向后移動一定的字符數(shù)。當返回值小于請求的字符數(shù)count時,并不意味著產(chǎn)生了錯誤,出現(xiàn)這種情況可能是因為:(1)已經(jīng)接近文件尾,沒有count這么多個字節(jié)可讀;(2)或者進程正在從管道或終端讀取數(shù)據(jù):(3)或者read函數(shù)被某個信號(signal)中斷,等等。如果read函數(shù)產(chǎn)生錯誤時,返回值為-1。,3、read函數(shù),三、基本文件I/O操作,write函數(shù)是將內(nèi)存中的數(shù)據(jù)寫入文件,其聲明格式如下: #include ssize_t write(int fd, const void *b

11、uf, size_t count) write函數(shù)的第1個參數(shù)是文件描述符,第2個參數(shù)是輸出緩沖區(qū)地址指針,第3個參數(shù)是要寫入的字節(jié)數(shù),它的功能是將buf所指內(nèi)存中的count個字節(jié)寫入文件描述符fd所指的文件。POSIX要求在一個write之后的read函數(shù)應(yīng)該返回新的數(shù)據(jù)。調(diào)用成功時,write調(diào)用返回寫入的字節(jié)數(shù)(為0表示沒有數(shù)據(jù)要寫)。當發(fā)生錯誤時,調(diào)用返回-1。如果write調(diào)用的參數(shù)count為0,且文件描述符fd指向一個普通文件,則調(diào)用將返回0且沒有其他任何實際影響。,4、write函數(shù),三、基本文件I/O操作,creat是進程新建一個文件時使用的函數(shù)。新建文件的功能也可以由op

12、en函數(shù)實現(xiàn)。creat函數(shù)的聲明格式如下: int creat(const char *pathname, mode_t mode); 此函數(shù)等效于: int open(const char *pathname, O_WRONLY|O_CREAT | O_TRUNC, mode_t mode); creat函數(shù)中的參數(shù)pathname和mode的含義與函數(shù)open中的一樣。如果pathname指向的文件不存在,系統(tǒng)就以指定的文件名和權(quán)限創(chuàng)建一個新文件;如果pathname指向的文件存在,系統(tǒng)就將該文件截斷,釋放以前數(shù)據(jù)所占用的磁盤塊。對文件截斷的操作受原文件存取權(quán)限的限制。creat函數(shù)中的

13、參數(shù)mode與umask計算生成存取權(quán)限的方法與open一樣。這里要注意的是,open可以打開一個特殊設(shè)備文件,而creat不能創(chuàng)建設(shè)備文件,創(chuàng)建特殊文件要用函數(shù)mknod來代替。 當調(diào)用成功時,creat函數(shù)返回值為該文件的描述符。此時文件以只讀方式打開。失敗時返回值為-1。,5、creat函數(shù),三、基本文件I/O操作,可以使用1seek函數(shù)來指定文件偏移量的位置,從而實現(xiàn)文件的隨機存取。其聲明格式如下: off_t lseek(int fds, off_t offset, int whence); lseek函數(shù)的第1個參數(shù)是文件描述符,第2個參數(shù)是偏移量,指的是每一讀寫操作所需移動距離,

14、以字節(jié)數(shù)量作單位,這個值可正可負。正值指的是向前移,負值指的是向后移。第3個參數(shù)whence是當前位置的基點,它的取值如表3-3(P95)。 lseek函數(shù)允許文件偏移量被設(shè)置到超過文件結(jié)束符(EOF)處。如果這樣的話,下一次調(diào)用write時,可以將文件的長度延伸到所需的長度,并用無意義的字符填充這個空隙。如果隨后的read讀取這個空隙間的數(shù)據(jù),將得到無意義的值,直到這個文件數(shù)據(jù)塊被真正寫回到磁盤上,再讀取這個空隙間的數(shù)據(jù)將得到0。 當lseek調(diào)用成功時,返回值為一個以字節(jié)為單位從文件頭開始計算文件偏移量的值。調(diào)用失敗時,返回值為-1。,6、lseek函數(shù),系統(tǒng)調(diào)用-定位,int lseek

15、(int fd, offset_t offset, int whence) 功能:將文件讀寫指針相對whence移動offset個字節(jié)。操作成功時,返回文件指針相對于文件頭的位置。,系統(tǒng)調(diào)用-定位,whence可使用下述值:SEEK_SET:當前位置為文件的開頭SEEK_CUR:當前位置為文件指針的位置SEEK_END:當前位置為文件的末尾 offset可取負值,例如下述調(diào)用可將文件指針相對當前位置向前移動5個字節(jié): lseek(fd, -5, SEEK_CUR),系統(tǒng)調(diào)用-定位,如何利用lseek來計算文件長度?,系統(tǒng)調(diào)用-定位,由于lseek函數(shù)的返回值為文件指針相對于文件頭的位置,因此下

16、列調(diào)用的返回值就是文件的長度: lseek(fd, 0, SEEK_END),四、文件高級操作,設(shè)置文件的存取權(quán)限,分為屬主、同組用戶和其他用戶三類。每類分為讀、寫和執(zhí)行權(quán)限。其實這只是文件模式的一部分,屬于文件模式的低9位(二進制)。下面再介紹一下文件模式的高7位(二進制)。,1、文件模式,四、文件高級操作,-umask函數(shù):每當進程創(chuàng)建一個新文件或新目錄時,它所指定的文件訪問權(quán)限將受到文件創(chuàng)建屏蔽umask的作用。 -chmod和fchmod函數(shù):chmod函數(shù)用于修改任何類型的一個現(xiàn)存文件的存取權(quán),調(diào)用成功時返回0,否則返回-1。只有root用戶或文件屬主才能調(diào)用chmod。fchmod

17、與chmod類似,不同的是它操作的是已打開文件描述符給出的文件。 -chown和fchown函數(shù):chown和fchown函數(shù)用于改變文件的所有權(quán)關(guān)系,即可以改變文件的屬主ID和所屬組ID。只有root用戶才可以使用chown函數(shù)來改變一個文件的所有者及其所屬的組。 -rename函數(shù):rename函數(shù)用來對文件重命名。 -truncate和ftruncate函數(shù):有時需要對文件的大小進行修改。這時將會用到截斷文件長度的函數(shù)truncate和ftruncate。 -access(const char *pathname,int mode)函數(shù):access檢查用戶對一個文件的權(quán)限情況,根據(jù)mo

18、de的值檢查調(diào)用進程對文件pathname是否具有讀、寫或執(zhí)行的權(quán)限。,2、確定和改變文件模式,系統(tǒng)調(diào)用-訪問判斷,有時侯我們要判斷文件是否可以進行某種操作(讀,寫等),這個時候我們可以使用access函數(shù)。 int access(const char*pathname,int mode) Pathname:文件名稱 Mode:要判斷的屬性??梢匀∫韵轮祷蛘呤撬麄兊慕M合. R_OK文件可讀,W_OK文件可寫,X_OK文件可執(zhí)行,F_OK文件存在。 返回值:當我們測試成功時,函數(shù)返回0,否則如果一個條件不符時,返回-1。,系統(tǒng)調(diào)用-訪問判斷,例: #include int main() if (

19、access(“/etc/passwd”,R_OK) = =0) printf(“/etc/passwd can be read!n”); ,四、文件高級操作,(1)utime和utimes函數(shù) int utime(const char *filename,struct utimebuf * buf); int utimes(char * filename.struct timeval tvp2); 可以利用utime函數(shù)來改變一個文件的訪問時間和修改時間,但是沒有函數(shù)可以改變文件的特性修改時間,因為inode是由系統(tǒng)來維護的。 utime調(diào)用成功將返回0并且自動更新文件的特性修改時間st_c

20、time;否則返回-1。 Linux另外還提供了一個與utime功能相同的函數(shù)utimes,但它比utime具有更高的時間解析度,utimes可以設(shè)置文件的訪問和修改時間至微秒。,3、查詢文件信息,四、文件高級操作,(2)stat、fstat和lstat函數(shù) int stat(const char *pathname,struct stat *buf); int lstat(const char *pathname,struct stat * buf); int fstat(int fd,struct stat *buf); 這些函數(shù)將返回指定文件的信息。調(diào)用這些函數(shù)的進程不需要任何對該指定文

21、件的訪問權(quán)限就可獲得這些信息,但調(diào)用這些函數(shù)的進程需要對指定文件的路徑有搜索的權(quán)限。stat函數(shù)將文件pathname的信息存放在參數(shù)buf所指向的stat結(jié)構(gòu)中。lstat與stat功能相同,其唯一的區(qū)別是,對于符號鏈接文件,lstat返回的是該符號鏈接本身的信息,而stat返回的是符號鏈接所指向文件的信息。而fstat也與stat的功能相同,區(qū)別僅在于stat使用文件名指向文件,而fstat用文件描述符指向文件。由于這個區(qū)別,fstat可以獲得非命名管道文件的狀態(tài)信息,而stat則不能。,3、查詢文件信息,四、文件高級操作,(1)dup和dup2函數(shù) int dup (int oldfd)

22、; int dup2(int odlfd,int newfd); 這兩個函數(shù)調(diào)用都將復制文件描述符oldfd。也就是說,新得到的文件描述符和原來的文件描述符將共同指向一個打開的文件。兩個調(diào)用的返回值都為新的文件描述符,不同的是,系統(tǒng)調(diào)用dup的返回值是最小的未用文件描述符,而系統(tǒng)調(diào)用dup2的返回值是預先指定的文件描述符newfd。如果文件描述符newfd正在被使用,則先關(guān)閉newfd。如果newfd同oldfd,則不關(guān)閉該文件正常返回。,4、文件其它操作,四、文件高級操作,(2)fcntl函數(shù) int fcntl(int fd , int cmd); int fcntl(int fd,int

23、 cmd,long arg); int fcntl(int fd,int cmd,struct flock * lock); 函數(shù)名fcntl代表文件控制(file control),它提供了進一步管理低級文件描述符的各種手段,用它可以對已打開的文件描述符執(zhí)行各種控制操作。fcntl函數(shù)是對已打開文件的文件描述符進行各種控制操作。根據(jù)參數(shù)cmd的值決定是否要第三個附加參數(shù)arg。,4、文件其它操作,四、文件高級操作,-getwd和getcwd函數(shù): char * getwd(char *pathbuf); char * getcwd(char *pathbuf,size_t size); ge

24、twd函數(shù)確定調(diào)用進程當前工作目錄的絕對路徑名,復制該路徑名于pathbuf所指、由我們自己提供的字符數(shù)組中,然后返回指向該數(shù)組的指針。 getcwd函數(shù)的作用與getwd相同,不同的是它給出了另一個參數(shù)size指明存放路徑名字符數(shù)組的大小。 -chdir和fchdir函數(shù): chdir和fchdir函數(shù)用于重新指定調(diào)用進程的當前工作目錄。 -mkdir和rmdir函數(shù): mkdir函數(shù)用于創(chuàng)建目錄。rmdir函數(shù)用于刪除一個空目錄。,5、目錄文件操作,四、文件高級操作,-opendir函數(shù): 當訪問一個目錄文件時,同普通文件一樣,需要將其打開。打開目錄文件的函數(shù)是opendir。 -closedir函數(shù): 關(guān)閉一個已打開目錄文件的函數(shù)為closedir。 -readdir函數(shù): struct dirent * readdir(DIR *dp); Linux系統(tǒng)提供了讀取一個目錄文件內(nèi)容的函數(shù)readdir ,函數(shù)調(diào)用成功,返回值為為指向dirent的結(jié)構(gòu)指針。函數(shù)調(diào)用失敗,返回值為0。,5、目錄文件操作,四、文件高級操作,-mknod函數(shù): 利用creat和open函數(shù)只能建立一般文件,要建立其他類型的文件

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論