linux教程-第3章--文件系統(tǒng)簡(jiǎn)介課件
,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),第,3,章 文件系統(tǒng)簡(jiǎn)介,3.1,Linux,下的,文件系統(tǒng),3.2,文件的通用操作,方法,3.3 socket,文件類型,2、教學(xué)要求,掌握:文件描述符,的作用,、文件的通用操作方法、fctnl與ioctl,了解:文件系統(tǒng)、socket文件類型,第3章 文件系統(tǒng)簡(jiǎn)介3.1 Linux下的文件系統(tǒng),1,3.1,Linux,下的文件系統(tǒng),3.1.1 Linux,下文件的,內(nèi)涵,3.1.2,文件系統(tǒng)的,創(chuàng)建,3.1.3,掛接,文件系統(tǒng),3.1.4,索引節(jié)點(diǎn),inode,3.1.5,普通,文件,3.1.6,設(shè)備,文件,3.1.7,虛擬文件系統(tǒng),VFS,3.1 Linux下的文件系統(tǒng)3.1.1 Linux下文,2,3.1.1 Linux,下文件的內(nèi)涵,Linux,下的文件系統(tǒng)是對(duì)復(fù)雜系統(tǒng)進(jìn)行合理抽象的一個(gè)經(jīng)典的例子,它通過(guò)一套統(tǒng)一的接口函數(shù)對(duì)不同的文件進(jìn)行操作。,普通文件,字符設(shè)備文件,塊設(shè)備文件,socket,文件,3.1.1 Linux下文件的內(nèi)涵Linux下的文件系統(tǒng)是,3,3.1.2,文件系統(tǒng)的創(chuàng)建,在,Linux,下對(duì)磁盤進(jìn)行操作的工具是,fdisk,,與,Windows,下的,fdisk,功能有些類似,但是命令的格式完全不同。,1,系統(tǒng)分區(qū)情況,:fdisk-l,2,建立分區(qū),3,查看分區(qū)是否成功,4,格式化分區(qū),5,掛載分區(qū),6,查看分區(qū)掛載情況,3.1.2 文件系統(tǒng)的創(chuàng)建在Linux下對(duì)磁盤進(jìn)行操作的工,4,查看分區(qū),/usb,情況:,sudo fdisk-l,查看分區(qū)/usb情況:sudo fdisk-l,5,3.1.3,掛接文件系統(tǒng),Linux,系統(tǒng)下,要使用一個(gè)文件系統(tǒng)需要先將文件系統(tǒng)的分區(qū)掛載到系統(tǒng)上。,mount,命令用于掛載文件,它有很多選項(xiàng)。,mount,命令的使用格式為:,mount t type mountpoint device o options,例子:將,U,盤掛到,/mnt/usb,目錄下(如不存在則要建該目錄),根據(jù),fdisk-l,知道,u,盤的名稱和文件格式,sudo,mount-t msdos/dev/sdb1/mnt/usb,/mnt/usb,以后就代表,U,盤了,卸載:,sudo u,mount /mnt/usb,3.1.3 掛接文件系統(tǒng)Linux系統(tǒng)下,要使用一個(gè)文件系,6,3.2,文件的通用操作方法,3.2.1,文件,描述符,3.2.2,打開(kāi)創(chuàng)建文件,open(),、,create(),函數(shù),3.2 文件的通用操作方法3.2.1 文件描述符,7,3.2.1,文件描述符,在,Linux,下用文件描述符,來(lái),表示設(shè)備文件和普通文件,。文件描述符是一個(gè)整型的數(shù)據(jù),所有對(duì)文件的操作都通過(guò)文件描述符實(shí)現(xiàn)。文件描述符的范圍是,0,OPEN_MAX,。,在,Linux,系統(tǒng)中有,3,個(gè)已經(jīng)分配的文件描述符,即,標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤,,它們,文件描述符的值分別為,0,、,1,和,2,。,3.2.1 文件描述符在Linux下用文件描述符來(lái)表示設(shè)備,8,Linux,通過(guò)文件描述符操作文件的原理,Linux通過(guò)文件描述符操作文件的原理,9,linux教程-第3章-文件系統(tǒng)簡(jiǎn)介課件,10,3.2.2,打開(kāi)創(chuàng)建文件,open(),、,create(),函數(shù),使用這些函數(shù)需要頭文件:,sys/types.h,、,sys/stat.h,、,fcntl.h,1,函數(shù),open(),、,create(),介紹,2,使用函數(shù),open(),的例子,3.2.2 打開(kāi)創(chuàng)建文件open()、create()函數(shù),11,1,函數(shù),open(),、,create(),介紹,P.73,int open(const char,*,pathname,int flags);,int open(const char,*,pathname,int flags,mode_t mode);,1函數(shù)open()、create()介紹 P.73int,12,1,函數(shù),open(),、,create(),介紹,P.73,int open(const char,*,pathname,int flags);,int open(const char,*,pathname,int flags,mode_t mode);,1函數(shù)open()、create()介紹 P.73int,13,1,函數(shù),open(),、,create(),介紹,P.73,int open(const char,*,pathname,int flags,mode_t mode);,1函數(shù)open()、create()介紹 P.73int,14,2,使用函數(shù),open(),的例子,10fd=open(filename,O_RDWR);/*,打開(kāi)文件為可讀寫方式*,/,2使用函數(shù)open()的例子10fd=open(f,15,3.2.3,關(guān)閉文件,close(),函數(shù),close(),函數(shù)關(guān)閉一個(gè)打開(kāi)的文件,之前打開(kāi)文件所占用的資源。,1,close(),函數(shù),介紹,2,close(),函數(shù)的例子,3.2.3 關(guān)閉文件close()函數(shù)close()函數(shù)關(guān),16,1,close(),函數(shù)介紹,close(),函數(shù)的原型如下:,#include,int close(int fd);,1close()函數(shù)介紹close()函數(shù)的原型如下:,17,3.2.4,讀取文件,read(),函數(shù),用,read(),函數(shù)從打開(kāi)文件中讀數(shù)據(jù),用戶可以對(duì)讀入的數(shù)據(jù)進(jìn)行操作。,1,read(),函數(shù),介紹,2,read(),函數(shù)的例子,3.2.4 讀取文件read()函數(shù)用read()函數(shù)從打,18,1,read(),函數(shù)介紹,使用這個(gè)函數(shù)需要將頭文件,unistd.h,加入。,read(),函數(shù)的原型定義格式如下。,ssize_t read(int fd,void,*,buf,size_t count);,1read()函數(shù)介紹使用這個(gè)函數(shù)需要將頭文件unistd,19,2,read(),函數(shù)的例子,fd=open(filename,O_RDONLY);,2read()函數(shù)的例子,20,3.2.5,寫文件,write(),函數(shù),write(),函數(shù)向打開(kāi)的文件中寫入數(shù)據(jù),將用戶的數(shù)據(jù)保存到文件中。,1,write(),函數(shù),介紹,2,write(),函數(shù)的例子,3.2.5 寫文件write()函數(shù)write()函數(shù)向打,21,1,write(),函數(shù)介紹,write(),的函數(shù)原型如下。,#include,ssize_t write(int fd,const void,*,buf,size_t count);,函數(shù)操作成功會(huì)返回寫入的字節(jié)數(shù),當(dāng)出錯(cuò)的時(shí)候返回,1,。出錯(cuò)的原因有多種,像磁盤已滿,或者文件大小超出系統(tǒng)的設(shè)置,例如,ext2,下的文件大小限制為,2Gbytes,等。,1write()函數(shù)介紹write()的函數(shù)原型如下。,22,2,write(),函數(shù)的例子,23,size,=write(fd,buf,strlen(buf);/*,將數(shù)據(jù)寫入到文件,test.txt,中*,/,2write()函數(shù)的例子,23,3.2.7,獲得文件狀態(tài),fstat(),函數(shù),有的時(shí)候?qū)ξ募僮鞯哪康牟皇亲x寫文件,而是要獲得文件的狀態(tài)。例如,獲得目標(biāo)文件的大小、權(quán)限、時(shí)間等信息。,stat,信息大多來(lái)自,i,節(jié)點(diǎn)。,1,fstat(),函數(shù),介紹,2,stat(),函數(shù)的例子,3.2.7 獲得文件狀態(tài)fstat()函數(shù)有的時(shí)候?qū)ξ募?24,1,fstat(),函數(shù)介紹,在程序設(shè)計(jì)的時(shí)候經(jīng)常要用到文件的一些特性值,例如,文件的所有者、文件的修改時(shí)間、文件的大小等。,stat(),函數(shù)、,fstat(),函數(shù)和,lstat(),函數(shù)可以獲得文件的狀態(tài),其函數(shù)原型如下:,#include,#include,#include,int stat(const char,*,path,struct stat,*,buf);,int fstat(int filedes,struct stat,*,buf);,int lstat(const char,*,path,struct stat,*,buf);,1fstat()函數(shù)介紹在程序設(shè)計(jì)的時(shí)候經(jīng)常要用到文件的一,25,2,stat(),函數(shù)的例子,P.84,struct stat st;,if(-1=stat(test.txt,&st)/*,獲得文件的狀態(tài),將狀態(tài)值放入,st,中*,/,2stat()函數(shù)的例子 P.84,26,3.2.8*,文件空間映射,mmap(),函數(shù),mmap(),函數(shù)將文件映射到內(nèi)存中的某一段,內(nèi)存比磁盤快些。映射到的內(nèi)存并不占用空間,僅僅占用一段地址空間。,1,mmap(),函數(shù),介紹,2,munmap(),函數(shù),介紹,3,mmap(),函數(shù)和,munmap(),函數(shù)的例子,3.2.8*文件空間映射mmap()函數(shù)mmap()函數(shù),27,1,mmap(),函數(shù)介紹,mmap(),函數(shù)的原型如下。,#include,void,*,mmap(void,*,start,size_t length,int prot,int flags,int fd,off_t offset);,1mmap()函數(shù)介紹mmap()函數(shù)的原型如下。,28,2,munmap(),函數(shù)介紹,與,mmap(),函數(shù)對(duì)應(yīng)的函數(shù)是,munmap(),函數(shù),它的作用是取消,mmap(),函數(shù)的映射關(guān)系。其函數(shù)原型如下:,#include,int munmap(void,*,start,size_t length);,2munmap()函數(shù)介紹與mmap()函數(shù)對(duì)應(yīng)的函數(shù)是m,29,3,mmap(),函數(shù)和,munmap(),函數(shù)的例子,29ptr=(char*)mmap(NULL,FILELENGTH,PROT_READ|,PROT_WRITE,MAP_SHARED,fd,0,);,37,munmap(ptr,FILELENGTH);,/*,取消文件映射關(guān)系*,/,3mmap()函數(shù)和munmap()函數(shù)的例子,30,3.2.9,文件屬性,fcntl(),函數(shù),fcntl(),函數(shù)用于獲得和改變已經(jīng)打開(kāi)文件的性質(zhì)。,1,fcntl(),函數(shù),介紹,2,F_GETFL,的,例子,3,F_SETFL,的,例子,4,F_GETOWN,的,例子,5,F_SETOWN,的例子,3.2.9 文件屬性fcntl()函數(shù)fcntl()函數(shù)用,31,1,fcntl(),函數(shù)介紹,fcntl(),函數(shù)向打開(kāi)的文件,fd,發(fā)送命令,更改其屬性。函數(shù)原型如下:,#include,#include,int fcntl(int fd,int cmd);,int fcntl(int fd,int cmd,long arg);,int fcntl(int fd,int cmd,struct flock,*,lock);,1fcntl()函數(shù)介紹fcntl()函數(shù)向打開(kāi)的文件fd,32,2,F_GETFL,的例子,(,P.89 fcntl-01.c),10,flags=fcntl(0,F_GETFL,0);,/,*獲得標(biāo)準(zhǔn)輸入的狀態(tài)的狀態(tài)*,/,if(flags 0),/*錯(cuò)誤發(fā)生*/,printf(failure to use fcntln);,return-1;,accmode=flags/*獲得訪問(wèn)模式*/,2F_GETFL的例子(P.89 fcntl-01.c),33,3,F_SETFL,的例子,P.90 fcntl-02.c,:用,fcntl,修改文件狀態(tài),加上,“,修改狀態(tài),”,int fd=open(test.txt,O_RDWR);,flags=fcntl(fd,F_GETFL,0);/*獲得文件狀態(tài)*/,flags|=O_APPEND;/*增加狀態(tài)為可追加*/,flags=fcntl(fd,F_