南郵Linux-第6章_第1頁
南郵Linux-第6章_第2頁
南郵Linux-第6章_第3頁
南郵Linux-第6章_第4頁
南郵Linux-第6章_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第6章 Linux文件與目錄鄭謙益、韓京宇內(nèi)容概要6.1 文件系統(tǒng)概述6.2 文件的基本輸入輸出6.3 文件屬性操作6.4 目錄操作6.5 標(biāo)準(zhǔn)I/O庫6.6 I/O重定向6.1.1文件系統(tǒng)概述文件系統(tǒng)的基本組成單位是文件, 文件中存放的數(shù)據(jù)通過文件系統(tǒng)與塊設(shè)備上的塊建立映射。文件系統(tǒng)將所有的文件通過目錄連接成一棵目錄樹,Linux系統(tǒng)中的根目錄是“/”。目錄是一種特殊的文件,其內(nèi)容由若干目錄項(xiàng)構(gòu)成(每個(gè)目錄項(xiàng)包含文件名和i節(jié)點(diǎn)編號(hào))。6.1.1文件系統(tǒng)概述每個(gè)目錄項(xiàng)對(duì)應(yīng)一個(gè)文件,也包括目錄,目錄項(xiàng)中記錄了文件名和i-節(jié)點(diǎn)號(hào)。i-節(jié)點(diǎn)號(hào)對(duì)應(yīng)所屬文件i-節(jié)點(diǎn)在i-節(jié)點(diǎn)表中的位置, i-節(jié)點(diǎn)中記錄

2、了除文件名外文件的所有信息。 6.1.2虛擬文件系統(tǒng)虛擬文件系統(tǒng)是對(duì)各種真實(shí)文件系統(tǒng)的抽象,真實(shí)文件系統(tǒng)通過這些接口與虛擬文件系統(tǒng)相連接,真實(shí)文件系統(tǒng)是這些抽象接口的具體實(shí)現(xiàn)。普通文件,管道,目錄文件,設(shè)備文件(包括塊設(shè)備文件和字符設(shè)備文件),套接字都通過虛擬文件系統(tǒng)提供統(tǒng)一的接口。6.1.2 虛擬文件系統(tǒng) 為了提高存取效率,在虛擬文件系統(tǒng)和真實(shí)文件系統(tǒng)之間建立基于頁的高速緩沖,這樣可以減少I/O操作的次數(shù),提高文件的存取效率。6.1.3文件系統(tǒng)結(jié)構(gòu)文件系統(tǒng)中邏輯塊可歸納為三類,超級(jí)塊、i-節(jié)點(diǎn)區(qū)和數(shù)據(jù)區(qū)。 超級(jí)塊用于存放整個(gè)文件系統(tǒng)的管理信息,其中定義了各區(qū)的大小、i-節(jié)點(diǎn)分配表和數(shù)據(jù)區(qū)的位

3、置等管理信息。 6.1.3文件系統(tǒng)結(jié)構(gòu)i-節(jié)點(diǎn)區(qū)用于存放i-節(jié)點(diǎn),每個(gè)文件都有各自唯一的i-節(jié)點(diǎn),i-節(jié)點(diǎn)中存放了與文件相關(guān)的所有信息,例如,文件內(nèi)容在數(shù)據(jù)區(qū)的分布、文件的大小、權(quán)限管理信息和文件的創(chuàng)建時(shí)間等。數(shù)據(jù)區(qū)則是存放系統(tǒng)中所有文件的內(nèi)容。 6.1文件系統(tǒng)概述應(yīng)用編程接口包括 文件的輸入輸出操作文件屬性操作目錄操作標(biāo)準(zhǔn)I/O庫I/O重定向6.2文件的基本輸入輸出文件基本輸入輸出操作是Linux內(nèi)核提供的最基礎(chǔ)的文件訪問接口,在glibc中,這些操作對(duì)應(yīng)的函數(shù)有open、read、write、lseek和close等。它們和Linux內(nèi)核中的相應(yīng)系統(tǒng)調(diào)用一一對(duì)應(yīng),glibc僅對(duì)這些系統(tǒng)調(diào)用

4、的硬件接口特性進(jìn)行了封裝。6.2文件的基本輸入輸出文件描述符表fd,是一個(gè)指針數(shù)組,每個(gè)指針指向一個(gè)file結(jié)構(gòu),用于記錄一個(gè)打開文件的狀態(tài)信息,其中f_pos記錄打開文件的當(dāng)前讀寫位置f_dentry打開文件所在目錄f_op文件具體的操作集6.2文件的基本輸入輸出fd數(shù)組的前三個(gè)描述符0 代表標(biāo)準(zhǔn)輸入1代表標(biāo)準(zhǔn)輸出2代表標(biāo)準(zhǔn)錯(cuò)誤輸出6.2文件的基本輸入輸出int open(const char *pathname, int flags, mode_t mode);pathname: 文件的路徑名flags :指定文件的操作模式mode :僅當(dāng)創(chuàng)建新文件時(shí)使用,用于指定文件的訪問權(quán)限位 返回值

5、:文件表述符6.2文件的基本輸入輸出ssize_t read(int fd, void *buf, size_t count) fd 文件描述符buf 存放讀取數(shù)據(jù)的內(nèi)存緩沖count 讀取的字節(jié)數(shù) 返回值:讀取的字節(jié)數(shù)6.2文件的基本輸入輸出ssize_t write(int fd, const void *buf, size_t count); fd 文件描述符buf 寫入數(shù)據(jù)的緩沖區(qū)count 準(zhǔn)備寫入的字節(jié)數(shù)返回值:成功寫入文件的字節(jié)數(shù) 6.2文件的基本輸入輸出off_t lseek(int fd, off_t offset, int whence); fd 文件描述符offset 移

6、動(dòng)的偏移量whence 從何處開始計(jì)算偏移量 返回值:成功返回目前的讀寫位置6.2文件的基本輸入輸出int close(int fd); 6.2文件的基本輸入輸出標(biāo)準(zhǔn)輸入輸出文件的定義標(biāo)準(zhǔn)輸入輸出文件的定義 對(duì)于由Shell創(chuàng)建的進(jìn)程,在進(jìn)程的文件描述符表中,有三個(gè)繼承自父進(jìn)程的已打開文件,文件描述符分別為0、1和2。分別對(duì)應(yīng)于標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤輸出。在 C語言函數(shù)庫中,從兩個(gè)不同的層次對(duì)它們進(jìn)行了定義。6.2文件的基本輸入輸出1、文件描述符的定義(系統(tǒng)調(diào)用)由系統(tǒng)級(jí)函數(shù)庫中的unistd.h定義,數(shù)據(jù)類型為整型,供系統(tǒng)函數(shù)庫中的函數(shù)使用,例如,open,read,write和clo

7、se等函數(shù),在unistd.h文件中的定義如下:#define STDIN_FILENO 0#define STDOUT_FILENO 1#define STDERR_FILENO 26.2文件的基本輸入輸出2、標(biāo)準(zhǔn)輸入輸出流的定義 由標(biāo)準(zhǔn)I/O函數(shù)庫中的stdio.h文件定義,數(shù)據(jù)類型為FILE,供標(biāo)準(zhǔn)函數(shù)庫的函數(shù)使用, 例如:fopen,fread,fwrite和fclose等函數(shù)。程序62int main(int argc, char *argv ) int fdin, fdout, n; char bufBUFSIZ; if(argc !=3) fprintf(stderr, Usag

8、e: %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, n); exit(0); 6.3文件屬性操作文件的屬性信息存放于文件對(duì)應(yīng)的i-節(jié)點(diǎn)中,對(duì)于不同類型文件系統(tǒng),文件屬

9、性的組織形式也不盡相同。為了獲得統(tǒng)一的文件屬性格式,Linux中定義了一個(gè)名為struct stat的數(shù)據(jù)結(jié)構(gòu)。6.3文件屬性操作(自學(xué))struct stat dev_t st_dev; / 文件的設(shè)備編號(hào)ino_t st_ino; / i-節(jié)點(diǎn)號(hào)mode_t st_mode; / 文件的類型和存取權(quán)限nlink_t st_nlink; / 硬鏈接uid_t st_uid; / 用戶ID gid_t st_gid; / 組ID dev_t st_rdev; / 設(shè)備類型off_t st_off; / 文件字節(jié)數(shù)unsigned long st_blksize; / 塊大小unsigned l

10、ong st_blocks; / 塊數(shù)time_t st_atime; / 最后一次訪問時(shí)間time_t st_mtime; / 最后一次修改時(shí)間time_t st_ctime; / 最后一次改變時(shí)間(指屬性) ;6.4目錄操作從整體上看,文件系統(tǒng)對(duì)應(yīng)一棵由目錄和文件構(gòu)成的樹。目錄是一種特殊的文件,其內(nèi)容由若干個(gè)目錄項(xiàng)組成。每個(gè)目錄項(xiàng)中存放的是文件的名稱和i-節(jié)點(diǎn)的入口地址。為了便于管理,每個(gè)目錄中都包含當(dāng)前目錄“.”和父目錄“.”,當(dāng)前目錄指向當(dāng)前目錄i-節(jié)點(diǎn)編號(hào),父目錄則記錄了父目錄對(duì)應(yīng)i-節(jié)點(diǎn)的編號(hào) 。參見書上的65圖6.4.1目錄操作int mkdir(const char* path

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

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

13、nt long d_ino; / i-節(jié)點(diǎn)號(hào) char d_nameNAME_MAX+1; / 文件名 off_t d_off; / 在目錄文件中的偏移量 unsigned short d_reclen; /文件名長度 6.4.2目錄操作DIR * opendir(const char *pathname); pathname 目錄路徑名 返回值:成功,返回目錄流,一組目錄字符串,否則,返回錯(cuò)誤 6.4.2目錄操作struct dirent *readdir(DIR *dp); 返回下一個(gè)目錄項(xiàng) int closedir(DIR *dp); 關(guān)閉打開的目錄 參見例子程序6-9int main(

14、int argc, char *argv) DIR *dirp; struct dirent *direntp;if(dirp = opendir(argv1) = NULL) fprintf(stderr,error message: %sn,strerror(errno); / 顯示錯(cuò)誤信息顯示錯(cuò)誤信息 exit(1); while(direntp = readdir(dirp) != NULL) printf(%sn, direntp-d_name);closedir(dirp);exit(0); 6.5標(biāo)準(zhǔn)I/O庫read和write等底層系統(tǒng)調(diào)用函數(shù)進(jìn)行輸入輸出時(shí),在用戶態(tài)和內(nèi)核態(tài)之

15、間來回切換,每次讀出或?qū)懭氲臄?shù)據(jù)量較少,導(dǎo)致頻繁的I/O操作,增加了系統(tǒng)開銷。標(biāo)準(zhǔn)I/O庫是標(biāo)準(zhǔn)ANSI C規(guī)范的一部分,函數(shù)原型在文件stdio.h中定義,對(duì)底層I/O系統(tǒng)調(diào)用進(jìn)行了封裝,為程序員提供了帶有格式轉(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 st

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

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

18、 fread(void *buffer, size_t size, size_t nitems, FILE *inf); 參數(shù):buffer 存放讀取數(shù)據(jù)的緩沖區(qū)size 要讀取數(shù)據(jù)類型字節(jié)數(shù)nitems 要讀取的數(shù)量FILE 一個(gè)已打開的文件流 返回值:成功返回讀取的字節(jié)數(shù)程序程序6-11int main()FILE *fpt;char text80;fpt=fopen(data.txt,r);fread(text,1,15,fpt);text15=0;printf(%sn,text);fclose(fpt);6.5.2文件操作文件操作size_t fwrite(const void *bu

19、ffer, size_t size, size_t nitems, FILE *outf);參數(shù):buffer 存放輸出數(shù)據(jù)的緩沖區(qū)size 要輸出數(shù)據(jù)類型字節(jié)數(shù)nitems 要輸出的數(shù)量FILE 一個(gè)已打開的文件流 返回值:成功,返回實(shí)際寫入文件的字節(jié)數(shù) 程序6-12int main()FILE *fpt;char text80;sprintf(text,Fortytwo 42 bytes of data on the wall.);fpt=fopen(data2.txt,w);fwrite(text,1,strlen(text),fpt);fclose(fpt);6.5.2文件操作文件操作

20、int fclose(FILE *fp); 關(guān)閉文件流 6.5.3格式化輸入輸出int fprintf(FILE *stream, const char *format, .)參數(shù): stream 一個(gè)已打開的文件流指針format 輸出控制字符串作用:將緩沖區(qū)中的數(shù)據(jù)經(jīng)格式轉(zhuǎn)換后寫入文件返回值:成功寫入的字節(jié)數(shù) 程序6-13#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.36.5.3格式化輸入與輸出格式化輸入與輸出int fscanf(FILE *stream, const char *format, .); 參數(shù):stream 已打開的文件流動(dòng)format 輸入控制字符串 返回值:成功返回被賦值的數(shù)目程序6-1

溫馨提示

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

評(píng)論

0/150

提交評(píng)論