GNU Linux編程 第6章_第1頁
GNU Linux編程 第6章_第2頁
GNU Linux編程 第6章_第3頁
GNU Linux編程 第6章_第4頁
GNU Linux編程 第6章_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第6章 Linux文件與目錄鄭謙益、韓京宇內(nèi)容概要6.1 文件系統(tǒng)概述6.2 文件的基本輸入輸出6.3 文件屬性操作6.4 目錄操作6.5 標準I/O庫6.6 I/O重定向6.1文件系統(tǒng)概述為了便于管理,將外存抽象為由若干個邏輯塊 文件系統(tǒng)將一個邏輯塊定義為若干連續(xù)的扇區(qū),邏輯塊是構成文件系統(tǒng)的基本操作單元,每個塊都有自己的編號 文件系統(tǒng)就建立在由若干邏輯塊構成的線性空間上。因此,在Linux系統(tǒng)中,稱這些設備為塊設備 6.1文件系統(tǒng)概述文件系統(tǒng)的基本組成單位是文件, 文件中存放的數(shù)據(jù)盡管在塊設備中未必連續(xù), 這些數(shù)據(jù)通過文件系統(tǒng)與塊設備上的塊建立映射 文件系統(tǒng)將所有的文件通過目錄連接成一棵目

2、錄樹,Linux系統(tǒng)中的根目錄是/。目錄是一種特殊的文件,其內(nèi)容由若干目錄項構成,6.1文件系統(tǒng)概述每個目錄項對應一個文件,也包括目錄,目錄項中記錄了文件名和i-節(jié)點號,i-節(jié)點號對應所屬文件i-節(jié)點在i-節(jié)點表中的位置, i-節(jié)點中記錄了除文件名外文件的所有信息。 6.1文件系統(tǒng)概述虛擬文件系統(tǒng)是對各種真實文件系統(tǒng)的抽象,真實文件系統(tǒng)通過這些接口與虛擬文件系統(tǒng)相連接,真實文件系統(tǒng)是這些抽象接口的具體實現(xiàn)。參見圖61 6.1文件系統(tǒng)概述為了提高存取效率,在虛擬文件系統(tǒng)和真實文件系統(tǒng)之間建立基于頁的高速緩沖,這樣可以減少I/O操作的次數(shù),提高文件的存取效率。塊設備是建立真實文件系統(tǒng)的基礎。6.1

3、文件系統(tǒng)概述文件系統(tǒng)建立在由若干連續(xù)的邏輯塊構成的存儲空間中,但根據(jù)邏輯塊的用途,邏輯塊可歸納為三類,超級塊、i-節(jié)點區(qū)和數(shù)據(jù)區(qū)。 超級塊用于存放整個文件系統(tǒng)的管理信息,其中定義了各區(qū)的大小、i-節(jié)點表和數(shù)據(jù)區(qū)的位置等管理信息。 6.1文件系統(tǒng)概述i-節(jié)點區(qū)用于存放i-節(jié)點,每個文件都有各自唯一的i-節(jié)點,i-節(jié)點中存放了與文件相關的所有信息,例如,文件內(nèi)容在數(shù)據(jù)區(qū)的分布、文件的大小、權限管理信息和文件的創(chuàng)建時間等。數(shù)據(jù)區(qū)則是存放系統(tǒng)中所有文件的內(nèi)容。 6.1文件系統(tǒng)概述應用編程接口包括 文件的輸入輸出操作文件屬性操作目錄操作標準I/O庫I/O重定向6.2文件的基本輸入輸出文件基本輸入輸出操作

4、是Linux內(nèi)核提供的最基礎的文件訪問接口,在glibc中,這些操作對應的函數(shù)有open、read、write、lseek和close等它們和Linux內(nèi)核中的相應系統(tǒng)調(diào)用一一對應,glibc僅對這些系統(tǒng)調(diào)用的硬件接口特性進行了封裝 6.2文件的基本輸入輸出文件描述符表fd,是一個指針數(shù)組,每個指針指向一個file結構,用于記錄一個打開文件的狀態(tài)信息,其中f_pos記錄打開文件的當前讀寫位置f_dentry打開文件所在目錄f_op文件具體的操作集6.2文件的基本輸入輸出fd數(shù)組的前三個描述符0 代表標準輸入1代表標準輸出2代表標準錯誤輸出6.2文件的基本輸入輸出int open(const c

5、har *pathname, int flags, mode_t mode);pathname 文件的路徑名flags 指定文件的操作模式mode 僅當創(chuàng)建新文件時使用,用于指定文件的訪問權限位 6.2文件的基本輸入輸出ssize_t read(int fd, void *buf, size_t count) fd 文件描述符buf 存放讀取數(shù)據(jù)的內(nèi)存緩沖count 讀取的字節(jié)數(shù) 6.2文件的基本輸入輸出ssize_t write(int fd, const void *buf, size_t count); fd 文件描述符buf 寫入數(shù)據(jù)的緩沖區(qū)count 準備寫入的字節(jié)數(shù) 6.2文件的基

6、本輸入輸出off_t lseek(int fd, off_t offset, int whence); fd 文件描述符offset 移動的偏移量whence 從何處開始計算偏移量 6.2文件的基本輸入輸出int close(int fd); 6.2文件的基本輸入輸出標準輸入輸出文件的定義標準輸入輸出文件的定義對于由Shell創(chuàng)建的進程,在進程的文件描述符表中,有三個繼承自父進程的已打開文件,文件描述符分別為0、1和2。分別對應于標準輸入、標準輸出和標準錯誤輸出,在 C語言函數(shù)庫中,從兩個不同的層次對它們進行了定義。6.2文件的基本輸入輸出標準輸入輸出文件描述符的定義由系統(tǒng)級函數(shù)庫中的unis

7、td.h文件定義,數(shù)據(jù)類型為整型,供系統(tǒng)函數(shù)庫中的函數(shù)使用,例如,open,read,write和close等函數(shù),在unistd.h文件中的定義如下:#define STDIN_FILENO 0#define STDOUT_FILENO 1#define STDERR_FILENO 26.2文件的基本輸入輸出標準輸入輸出流的定義由標準I/O函數(shù)庫中的stdio.h文件定義,數(shù)據(jù)類型為FILE,供標準函數(shù)庫的函數(shù)使用, 例如:,fopen,fread,fwrite和fclose等函數(shù)。6.2文件的基本輸入輸出int main(int argc, char *argv ) int fdin, f

8、dout, n; char bufBUFSIZ; if(argc !=3) fprintf(stderr, Usage: %s filein fileoutn,argv0); exit(1); if(fdin = open(argv1,O_RDONLY) = -1) perror(argv1); exit(2); if(fdout = open(argv2,O_WRONLY | O_CREAT | O_TRUNC, PMODE) = -1) perror(argv2); exit(3); while(n = read(fdin, buf, BUFSIZ) 0) write(fdout,buf,

9、 n); exit(0); 6.3文件屬性操作文件的屬性信息存放于文件對應的i-節(jié)點中,對于不同類型文件系統(tǒng),文件屬性的組織形式也不盡相同為了獲得統(tǒng)一的文件屬性格式,Linux中定義了一個名為struct stat的數(shù)據(jù)源結構6.3文件屬性操作(自學)struct stat dev_t st_dev; / 文件的設備編號ino_t st_ino; / i-節(jié)點號mode_t st_mode; / 文件的類型和存取權限nlink_t st_nlink; / 硬鏈接uid_t st_uid; / 用戶ID gid_t st_gid; / 組ID dev_t st_rdev; / 設備類型off_t

10、 st_off; / 文件字節(jié)數(shù)unsigned long st_blksize; / 塊大小unsigned long st_blocks; / 塊數(shù)time_t st_atime; / 最后一次訪問時間time_t st_mtime; / 最后一次修改時間time_t st_ctime; / 最后一次改變時間(指屬性) ;6.4目錄操作從整體上看,文件系統(tǒng)對應一棵由目錄和文件構成的樹。 目錄中存放的是文件的名稱和i-節(jié)點的入口地址,為了便于管理,每個目錄中都包含當前目錄“.”和父目錄“.”,當前目錄指向當前目錄i-節(jié)點編號,父目錄則記錄了父目錄對應i-節(jié)點的編號 。6.4目錄操作int m

11、kdir(const char* pathname, mode_t mode); pathname 目錄路徑名mode 創(chuàng)建目錄的模式,參見open函數(shù) mkdir在某目錄中創(chuàng)建一個目錄項,分配一個i-節(jié)點與目錄項相鏈接,并分配一個邏輯塊用于存放目錄的內(nèi)容,在其中建立兩個目錄,當前目錄.和父目錄”.”。6.4目錄操作int rmdir(const char * pathname) ; pathname 目錄的路徑名 rmdir函數(shù)從目錄中刪除相應的目錄項,并釋放相應的i-節(jié)點,注意的是:rmdir函數(shù)只能刪除空目錄,也就是目錄中只包含當前目錄項和父目錄項的目錄。6.4目錄操作int chdir

12、(const char * pathname) ; pathname 新的工作路徑 當前工作目錄的信息以i-節(jié)點的形式記錄在每個進程的進程控制塊中,初始工作目錄繼承自父進程,進程在運行過程中可以改變工作目錄,pwd命令顯示的是Shell的當前工作目錄, 6.4目錄操作char *getcwd(char *buf, size_t size); buf 存放路徑的緩沖區(qū)size 路徑名包含的字節(jié)數(shù) 參見例子程序686.4目錄操作目錄是一種特殊的文件,在讀取其中的目錄項時,需借助于opendir、readdir和closedir函數(shù),在這些函數(shù)中,對目錄項的定義如下::struct dirent l

13、ong d_ino; / i-節(jié)點號 char d_nameNAME_MAX+1; / 文件名 off_t d_off; / 在目錄文件中的偏移量 unsigned short d_reclen; /文件名長度 6.4目錄操作DIR * opendir(const char *pathname); pathname 目錄路徑名 6.4目錄操作struct dirent *readdir(DIR *dp); 返回下一個目錄項 int closedir(DIR *dp); 關閉打開的目錄 參見例子程序6-96.5標準I/O庫read和write等底層系統(tǒng)調(diào)用函數(shù)進行輸入輸出時,在用戶態(tài)和內(nèi)核態(tài)之間

14、來回切換,每次讀出或?qū)懭氲臄?shù)據(jù)量較少,導致頻繁的I/O操作,增加了系統(tǒng)開銷。標準I/O庫是標準ANSI C規(guī)范的一部分,函數(shù)原型在文件stdio.h中定義,對底層I/O系統(tǒng)調(diào)用進行了封裝,為程序員提供了帶有格式轉(zhuǎn)換功能的輸入輸出操作,并在用戶空間增加了緩沖區(qū)管理。 6.5.2文件操作FILE * fopen(const char * path,const char * mode); 參數(shù)涵義: (1)path 要打開的文件路徑 (2)mode 打開模式 (參見書上121頁最下表格)成功, 返回指向被打開文件流指針,否則,返回NULL 6.5.2文件操作FILE的定義如下:typedef str

15、uct short level; / 緩沖區(qū)滿空程度 unsigned flags; / 文件狀態(tài)標志 char fd; / 文件描述符 unsigned char hold; / 無緩沖則不讀取字符 short bsize; / 緩沖區(qū)大小 unsigned char *buffer; / 數(shù)據(jù)緩沖區(qū) unsigned char *curp; / 當前位置指針 unsigned istemp; / 臨時文件指示器 short token; / 用于有效性檢查 FILE;6.5.2文件操作標準I/O函數(shù)庫提供了兩種類型的流:文本流和二進制流。 文本流是一行行的字符,換行符表示這一行的結束。二進

16、制流則不考慮讀寫數(shù)據(jù)的格式轉(zhuǎn)換,將文件看作由一系列字節(jié)構成字節(jié)序列。在標準I/O函數(shù)庫中,存在三個預定義的文本流,它們分別是stdin、stdout和stderr, stdin指向標準輸入流,對應于鍵盤;stdout指向標準輸出流,對應于終端顯示器;stderr指向標準錯誤輸出流,通常,對應于終端顯示器。6.5.2文件操作#include main()FILE *fpt;fpt=fopen(output.txt,w); / 創(chuàng)建流創(chuàng)建流fprintf(fpt,This is a test.);/ 輸入字符串至流輸入字符串至流fclose(fpt);/關閉流關閉流 6.5.2文件操作size_t

17、 fread(void *buffer, size_t size, size_t nitems, FILE *inf); buffer 存放讀取數(shù)據(jù)的緩沖區(qū)size 要讀取數(shù)據(jù)類型字節(jié)數(shù)nitems 要讀取的數(shù)量FILE 一個已打開的文件流 6.5.2文件操作size_t fwrite(const void *buffer, size_t size, size_t nitems, FILE *outf);buffer 存放輸出數(shù)據(jù)的緩沖區(qū)size 要輸出數(shù)據(jù)類型字節(jié)數(shù)nitems 要輸出的數(shù)量FILE 一個已打開的文件流 6.5.2文件操作int fclose(FILE *fp); 關閉文件流

18、 6.5.3格式化輸入輸出int fprintf(FILE *stream, const char *format, .), stream 一個已打開的文件流指針format 輸出控制字符串 6.5.3格式化輸入與輸出#include main()FILE *fp;float area,p=3.141592;int r;if(fp=fopen(sample,w)=NULL)printf(Error opening file !n);exit(0);fprintf(fp,Radius Arean);for(r=1;r10;r+)area=p*r*r;fprintf(fp,%4d %7fn,r,area);fclose(fp); 6.5.3格式化輸入與輸出int f

溫馨提示

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

評論

0/150

提交評論