《LinuxC從入門到精通》.明日科技.第09章.文件操作_第1頁
《LinuxC從入門到精通》.明日科技.第09章.文件操作_第2頁
《LinuxC從入門到精通》.明日科技.第09章.文件操作_第3頁
《LinuxC從入門到精通》.明日科技.第09章.文件操作_第4頁
《LinuxC從入門到精通》.明日科技.第09章.文件操作_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、文件初探本講大綱:文件文件與與文件系文件系統統的的概概念念文件的文件的屬屬性性文件的相文件的相關關信息信息文件與文件系統的概念 所謂文件是指一組相關數據的有序集合。在所謂文件是指一組相關數據的有序集合。在LinuxLinux系統系統中,文件中的數據與數據之間的關系,是由使用文件的應用中,文件中的數據與數據之間的關系,是由使用文件的應用程序建立和解釋的。他們僅在一個文件中有關系。程序建立和解釋的。他們僅在一個文件中有關系。 而文件系統是指文件數據結構和管理文件的程序集合,而文件系統是指文件數據結構和管理文件的程序集合,除此之外,還包括除此之外,還包括ext2ext2、ext3ext3等分區格式和

2、某個具體的目錄等分區格式和某個具體的目錄。文件的屬性在Linux系統中文件是很重要也很復雜的。每一個文件都存在其特有的屬性,包括文件類型和文件權限兩個方面。1.文件類型文件可以根據其處理方法的不同,分為緩沖區文件和非緩沖區文件。所謂緩沖區文件是指系統自動地在內存區為每一個正在使用的文件開辟一個緩沖區。而非緩沖區文件是指不自動的開辟確定大小的緩沖區,而由程序本身為每個文件設定緩沖區。從內存向磁盤輸出數據時,必須先送到內存中的緩沖區,待裝滿緩沖區后,再將數據一起送到磁盤。文件還可以根據其數據的組織形式的不同,分為文本文件和二進制文件。在Linux系統中,把文件看作是一個字符序列,即由一個個字符的數

3、據順序組成的文本文件和二進制文件。文本文件又稱之為ASCII文件,它的每一個字節存放一個ASCII代碼,代表一個字符,都是一一對應的,因而,此文件便于對字符進行逐個處理,也便于輸出字符,但是占用的存儲空間比較多。而且要花費ASCII碼與二進制形式間的轉換時間。二進制文件是把內存中的數據按其所在內存中的存儲形式原樣輸出到磁盤上存放,占用字節比較少,并且不需要轉換,但是一個字節并不對應一個字符,不能直接輸出字符形式。文件可以根據其存放數據的作用的不同,將其分為普通文件、目錄文件、鏈接文件、設備文件和管道文件。普通文件:它是在Linux系統中比較常遇見的一類文件,如圖形文件、數據文件、文檔文件、聲音

4、文件等等。在Linux系統中,所謂的普通文件就是不包含有文件系統的結構信息的文件。目錄文件:在Linux系統中,目錄文件是較特殊的一種文件,用于存放文件名及其相關信息的文件,是內核中用于組織文件系統的基本結點。鏈接文件:所謂的鏈接文件其實就是一個真實存在的文件的鏈接,當需要使用某個文件時,可以創建一個鏈接文件,指向需要調用的文件。設備文件:設備文件是Linux系統中最為特殊的一種文件,在Linux系統中,可以通過設備文件訪問外部的硬件設備,這樣用戶就可以像訪問普通文件一樣去訪問外部設備。在Linux系統中,設備文件通常都放在/dev目錄下。管道文件:在前面的多進程通信中,已經提及到管道文件這個

5、詞,這中文件主要用于不同進程間的信息傳遞。管道的一端用于寫入數據,另一端用于讀取數據,管道采用的是先進先出的原則。2.文件權限與Linux系統打交道這么久后,印象最深的應該就是它的多用戶特點。由于Linux系統是內核源碼開放的一種系統,那么當用戶不小心刪除或者修改了系統的重要文件后,就會給系統引起癱瘓的危險。因此Linux系統采用了多用戶的原則,對于不同的用戶訪問同一個文件設定了不同的權限,這樣更有利于保護系統的安全。對于Linux系統中的文件來說,權限分為3種:讀的權限(r)、寫的權限(w)和執行的權限(x)。每個文件都有對其具有所有權的用戶,通常稱之為文件所有者。在Linux系統中,用戶都

6、是以組為單元的,每一個用戶都存在一個組或者同時屬于多個組中。因此除了對文件擁有所有權的用戶之外,還有文件所有者的同組用戶和其他用戶。以文件為中心的這三類用戶對文件有著不同的訪問權限。文件的相關信息在Linux系統中,每一個文件都是存放在一個目錄下,通過一個與文件相關聯的索引節點保存文件的一些屬性信息。與文件相關的信息主要包括文件的目錄結構、索引節點和文件中存放的數據。1.文件的目錄結構系統中的所有文件都存放在根目錄root(/)下,所謂的目錄文件就像一棵大樹,從根目錄中又會分支出很多子目錄,在子目錄下又會分出很多下一級目錄或者普通文件。系統中的每個目錄都處于一定的目錄結構中,在這個目錄結構中含

7、有所有的目錄項的列表,每一個目錄項都是由這個目錄的名稱和索引節點構成,開發人員可以通過這個目錄文件的名稱訪問該目錄項下的內容,然后通過索引節點可以獲取該文件自身的一些屬性信息。2.索引節點(inode)在前面多次提及通過文件的索引節點可以獲取這個文件自身的一些信息,在Linux系統中,將這些索引節點所包含的信息封裝在stat這個結構體中。stat結構體的定義形式如下:struct statdev_t st_dev;/*文件使用的設備號*/ino_t st_ino;/*索引節點號*/mode_t st_mode;/*文件的訪問權限*/nlink_t st_nlink;/*硬連接數*/uid_t

8、st_uid;/*所有者用戶ID*/gid_t st_gid;/*用戶組ID*/dev_t st_rdev;/*設備文件的設備號*/off_t st_size;/*以字節為單位的文件大小*/blksize_t st_blksize;/*文件系統的磁盤塊大小*/blkcnt_t st_blocks;/*當前文件的磁盤塊大小*/time_t st_atime;/*最后一次訪問該文件的時間*/time_t st_mtime;/*最后一次修改該文件的時間*/time_t st_ctime;/*最后一次改變該文件狀態的時間*/;在Linux系統的終端下通過輸入命令“man 2 stat”,可以查看關于系

9、統調用函數stat的相關信息,在這里定義了結構體stat中存放的信息,效果如圖9.1所示。標題文件的相關操作本講大綱:修改文件修改文件屬屬性性復復制文件描述符制文件描述符獲獲取文件信息取文件信息文件的其他操作文件的其他操作修改文件屬性在Linux系統中,文件的操作有很多種,如文件的I/O操作,修改文件屬性的操作,賦值文件描述符的操作,以及一些對文件進行控制的相關操作等。在Linux系統中,文件的I/O操作有兩種操作模式,一種是基于文件描述符的I/O操作,另一種是基于文件流的I/O操作。在本章中不對文件的I/O操作進行介紹,在下一章中,對這部分內容進行詳細的講解。9.2.1 修改文件屬性文件的屬

10、性是很復雜的,并不僅是前面介紹的文件的類型和文件的權限,還包括文件的長度、所處的位置等等信息。在使用文件時,有時候需要改變文件的某些屬性,因此系統提供了系統調用函數滿足這一要求。1.改變文件的所有者系統提供了函數chown()和函數fchown()修改指定文件的所有者識別號和用戶組識別號,系統調用函數的定義形式如下:#include#includeInt chown(const char *pathname,uid_t owner,gid_t group);Int fchown(int fd,uid_t owner,gid_t group);這兩個系統調用函數都是用于修改文件的所有者識別號和用

11、戶組識別號。其中函數chown()中參數pathname代表的是文件的絕對路徑或相對路徑;函數fchown()中的參數fd表示文件的文件描述符,通過這兩個參數就指定了需要操作的文件。而參數owner代表的是該文件的新的所有者識別號;參數group代表的是指定文件的新的用戶組識別號。兩個函數調用成功時,返回值為0;調用失敗時,返回值為-1,并設置相應的errno值。?技巧:介紹的上述兩個函數實現的功能是相同的,但是兩個函數指定文件的方法不同,一個是通過指定的文件所在路徑,另一個是指定文件的文件描述符,兩者相比較而言,系統調用函數fchown()更加安全一些。在Linux系統中,每個文件對于其所有

12、者和所在的用戶組,都有特定的文件訪問權限,如只讀的權限,或者只寫的權限,或者執行的權限。當將文件的所有者和所在的用戶組進行修改后,其權限就會受到影響,因此,Linux系統的普通用戶,只能對自己擁有所有權的文件的用戶組識別號進行修改,并且只能在其所屬的組之中進行選擇。&說明:在Linux系統中,root用戶作為操作系統的最高級別的用戶,它可以調用這兩個函數對任意的文件進行修改。2.改變文件的訪問權限在Linux系統中,可以通過調用函數chmod()和函數fchmod()改變文件的訪問權限。文件的訪問權限就是前面介紹過的讀的權限、寫的權限和執行的權限。這兩個函數實現的功能是相同的,它們的關

13、系與前面介紹的chown()函數和fchown()函數的關系是相同的。函數chmod()和函數fchmoe()的定義形式如下:#include復制文件描述符在在LinuxLinux系統中提供了兩個函數系統中提供了兩個函數dup()dup()和和dup2()dup2()用于復制文件的描述符。用于復制文件的描述符。這兩個函數的定義形式如下:這兩個函數的定義形式如下:#include#includeInt dup(int oldfd);Int dup(int oldfd);Int dup2(int oldfd,int newfd);Int dup2(int oldfd,int newfd);這兩個函

14、數主要實現了復制一份參數這兩個函數主要實現了復制一份參數oldfdoldfd表示的文件描述符,并將文件描述符返回表示的文件描述符,并將文件描述符返回。復制出來的文件描述符與原來的文件描述符指的是同一個文件,共享所有的鎖定、復制出來的文件描述符與原來的文件描述符指的是同一個文件,共享所有的鎖定、讀寫位置和各項權限或旗標。讀寫位置和各項權限或旗標。如果函數調用成功,返回值為最小及尚未使用的文件描述符;否則返回值為如果函數調用成功,返回值為最小及尚未使用的文件描述符;否則返回值為-1-1,并,并設置適當的設置適當的errnoerrno值。值。dupdup返回的新文件描述符是該進程未使用的最小文件描述

15、符。返回的新文件描述符是該進程未使用的最小文件描述符。dup2dup2可以用可以用newfdnewfd參參數指定新描述符的數值。如果數指定新描述符的數值。如果newfdnewfd當前已經打開,則先將其關閉再做當前已經打開,則先將其關閉再做dup2dup2操作,操作,如果如果oldfdoldfd等于等于newfdnewfd,則,則dup2dup2直接返回直接返回newfdnewfd而不用先關閉而不用先關閉newfdnewfd再復制。再復制。獲取文件信息在Linux系統中提供了3個系統調用函數,用于獲取文件的信息。這3個函數的定義形式如下:#include#include#includeInt s

16、tat(const char *path,struct stat *buf);Int fstat(int fd,struct stat *buf);Int lstat(const char *path,struct stat *buf);參數path表示指向需要獲取信息的文件的路徑名,參數fd表示該文件的文件描述符,參數buf表示指向一個stat結構體類型的指針。上述3個函數主要是通過指針或者文件描述符所指定的文件進行相關信息的獲取,然后將獲取到的信息寫入到參數buf中。在調用系統調用函數獲取文件信息時,即使對該文件沒有讀取的權限,也可以獲取到該文件的信息。U注意:對于stat()函數和lst

17、at()函數,如果需要獲取處于某個目錄下的文件信息,則要求對該文件所處的所有上級目錄有執行的權限。?技巧:在Linux系統的終端下,可以通過輸入命令“man 2 stat”得到關于獲取文件信息的三個函數的詳細講解,并且還介紹了關于buf指針所指向的stat結構體的定義形式和成員變量的取值情況。例9.2 在Linux系統中,使用stat()函數獲取new.c文件的大小和該文件所有者的用戶ID值。(實例位置:光盤TMsl92)程序的代碼如下:#include#include#includemain()struct stat buf;stat(new.c,&buf);/*獲取new.c文件信

18、息,存放在buf中*/printf(new.c file size=%dn,buf.st_size);/*輸出文件大小*/printf(new.c file owner UID=%dn,buf.st_uid);/*輸出文件UID*/文件的其他操作在Linux系統中還提供了很多關于文件的系統調用函數,例如將緩沖區數據寫回磁盤、鎖定文件或解除文件的鎖定等等操作。1.將緩沖區數據寫回磁盤系統調用函數fsync()實現了將緩沖區數據寫回磁盤中。該函數的定義形式如下:#includeInt fsync(int fd);參數fd指的是文件的文件描述符。函數fsync()主要將參數fd所指的文件中的數據,由

19、緩沖區寫回磁盤,以確保數據同步。該函數調用成功時,返回值為0;否則,返回值為-1,并設置適當的errno錯誤代碼。2.鎖定文件系統調用函數flock()主要實現了對文件作各種鎖定或解除鎖定的動作。該函數的定義形式如下:#includeInt flock(int fd,int operation);參數fd表示用于操作的文件的文件描述符;參數operation表示對文件做的各種鎖定或者解除鎖定的操作方式。參數operation有如下4種取值情況:LOCK_SH:建立共享鎖定。多個進程可同時對同一個文件進行共享鎖定。LOCK_EX:建立互斥鎖定。一個文件同時只有一個互斥鎖定。LOCK_UN:解除文

20、件鎖定狀態。LOCK_NB:當無法建立鎖定時,此操作可不被阻斷,馬上返回進程。通常與LOCK_SH或LOCK_EX作或(|)運算。?技巧:在單一的文件無法同時建立共享鎖定和互斥鎖定,當使用了dup()函數復制了文件描述符,或者調用fork()函數創建了子進程時,文件描述符不會繼承此種鎖定。該函數調用成功時,返回值為0;否則返回值為-1,并設置適當的errno值。標題特殊文件的操作本講大綱:目目錄錄文件的操作文件的操作鏈鏈接文件的操作接文件的操作設備設備文件文件目錄文件的操作目錄文件是比較特殊的一種文件,用于存放文件名及其相關信息的文件,是內核中用于組織文件系統的基本結點。Linux系統從空間上

21、來開,都是由文件組成的,每一部分內容都存放到一個指定的文件中。目錄文件就像一棵大樹,從根處可以分支成許多叉,而Linux系統中的所有文件都存放在根目錄下,以“”表示。對于目錄文件有如下幾種常見的操作。1.獲取當前的工作目錄在Linux系統中提供了一個系統調用函數getcwd(),用于獲取當前的工作目錄。每一個進程都有一個當前的工作目錄這個概念,當前的工作目錄就是一個路徑名的解析。?技巧:在終端下,可以通過輸入命令“man 3 getcwd”獲取這個系統調用函數的詳細信息。函數getcwd()的定義形式如下:#includechar *getcwd(char *buf,size_t size);

22、參數buf用于存儲當前工作目錄的字符串;參數size用于存放字符串的大小。函數如果調用成功,返回指向當前工作目錄字符串的指針,否則返回NULL,并設置適當的errno值。例9.3 使用getcwd()函數獲取當前進程的工作目錄。(實例位置:光盤TMsl93)程序代碼如下:#include#include#includeint main()char aPATH_MAX;/*存放工作目錄的字符串*/if(getcwd(a,PATH_MAX)=NULL)/*獲取當前工作目錄*/perror(getcwd failed!);return 1;printf(輸出當前工作目錄:%sn,a);/*輸出字符數

23、組*/return 0;鏈接文件的操作在Linux系統中鏈接文件是一個特殊的文件,類似于Windows系統中的快捷方式,可以快速定位不同目錄下文件的方法。系統中存在兩種鏈接文件,一種是硬鏈接,另一種是符號鏈接,接下來對這兩類鏈接文件進行介紹。1.硬鏈接硬鏈接是依附于索引節點而存在的,在Linux系統中,使用硬鏈接,需要注意如下幾點:(1)目錄無法創建硬鏈接,只有文件才可以創建硬鏈接。(2)硬鏈接不能夠跨越文件系統,即不能為處在不同分區上的文件創建硬鏈接。在Linux系統的終端下,可以通過ln命令創建一個文件的硬鏈接。鏈接文件相當于原文件的一個快捷方式,兩個文件的索引節點值是一致的,當刪除原文件

24、時,硬鏈接文件依然指向原來的索引節點值,即索引節點沒有被刪除,因此想要刪除文件的數據,需要將文件以及所有的硬鏈接一同刪除。在Linux系統中提供了相關的系統調用函數創建一個新的硬鏈接和解除一個硬鏈接。創建硬鏈接函數link()系統調用函數link()的定義形式如下:#includeint link(const char *oldpath,const char *newpath);函數link()主要用于為一個已經存在的文件創建一個新的硬鏈接。參數oldpath代表已經存在的文件,參數newpath代表創建的新的硬鏈接的文件名。這兩個文件路徑需要在一個文件系統中。如果newpath文件已經存在,則不會在這個文件中寫入數據。該函數如果調用成功,返回值為0;否則返回值為-1,并設置相應的errno信息。刪除硬鏈接函數unlink()系統調用函數unlink()的定義形式如下:#includeInt unlink(const char *pathname);函數unlink()主要用于刪除一個已經存在的硬鏈接文件。參數pathname指向的就是這個存在的硬鏈接文件的路徑名稱。例9.4 通過系統調用函數link()為已經存在的文件old.c創建了一個硬鏈接,名稱為hardlink.c,并打開這個硬鏈接文件,打開10秒后,再通過unlink

溫馨提示

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

評論

0/150

提交評論