LINUX環(huán)境高級(jí)編程(四)_第1頁(yè)
LINUX環(huán)境高級(jí)編程(四)_第2頁(yè)
LINUX環(huán)境高級(jí)編程(四)_第3頁(yè)
LINUX環(huán)境高級(jí)編程(四)_第4頁(yè)
LINUX環(huán)境高級(jí)編程(四)_第5頁(yè)
已閱讀5頁(yè),還剩185頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

LINUX環(huán)境高級(jí)編程中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院朱靜中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院第四講系統(tǒng)調(diào)用線程進(jìn)程管理文件管理錯(cuò)誤處理系統(tǒng)調(diào)用概述系統(tǒng)調(diào)用概述系統(tǒng)調(diào)用概念為了利用文件操作、進(jìn)程管理和設(shè)備管理這些操作系統(tǒng)提供的服務(wù),應(yīng)用程序必須和操作系統(tǒng)之間交互。這種交互通過(guò)“系統(tǒng)調(diào)用”來(lái)實(shí)現(xiàn)。系統(tǒng)調(diào)用是程序員和linux內(nèi)核的函數(shù)接口。對(duì)程序員來(lái)說(shuō),系統(tǒng)調(diào)用就象庫(kù)函數(shù)(事實(shí)上有些就是庫(kù)函數(shù),由這些庫(kù)函數(shù)再進(jìn)行真正的系統(tǒng)調(diào)用),只是前者直接在linux的核心執(zhí)行子程序調(diào)用。中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院系統(tǒng)調(diào)用類(lèi)別文件管理進(jìn)程管理錯(cuò)誤管理系統(tǒng)調(diào)用概述中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件管理系統(tǒng)調(diào)用的層次結(jié)構(gòu)文件特殊文件目錄文件openclosereadwritelseekunlinkchowndup2fcntlfstatftruncatestattruncatesyncduplink套接字Internet套接字mknodioctlpipegetdentsacceptbindconnectlistensocketgethostbynamegethostnamehtonlhtonsinet_addrinet_ntoa系統(tǒng)調(diào)用概述中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院進(jìn)程管理系統(tǒng)調(diào)用的層次結(jié)構(gòu)進(jìn)程信號(hào)nicechdirwaitforkexecexitalarmsingnalkillpause系統(tǒng)調(diào)用概述中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院錯(cuò)誤處理系統(tǒng)調(diào)用的層次結(jié)構(gòu)錯(cuò)誤處理perror#include<string.h>char*strerror(interrnum)返回錯(cuò)誤原因的描述字符串系統(tǒng)調(diào)用概述中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院錯(cuò)誤處理錯(cuò)誤處理perror()#include<errno.h>#include<stdio.h>系統(tǒng)調(diào)用失敗時(shí)返回-1,但這個(gè)返回值說(shuō)明不了錯(cuò)誤發(fā)生的原因,要查詢(xún)錯(cuò)誤原因,必須了解:errno保存上次系統(tǒng)調(diào)用錯(cuò)誤的數(shù)字碼的全局變量,初值為0從程序訪問(wèn)errno,預(yù)定義的錯(cuò)誤碼在C程序中通過(guò)包含文件“/usr/include/errno.h”來(lái)定義。perror程序把errno的當(dāng)前值轉(zhuǎn)換為文本描述中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院例:/usr/include/…/errno.h所包含的部分錯(cuò)誤常量:#defineEPERM1/*Operationnotpermitted*/#defineENOENT2/*Nosuchfileordirectory*/#defineESRCH3/*Nosuchprocess*/#defineEINTR4/*Interruptedsystemcall*/錯(cuò)誤處理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院例:perror()應(yīng)用//showErrno.c#include<stdio.h>#include<fcntl.h>#include<errno.h>main(){intfd;/*打開(kāi)一個(gè)不存在的文件,強(qiáng)制發(fā)生一個(gè)錯(cuò)誤*/fd=open(“nonexist.txt”,O-RDONLY);If(fd==-1))/*anerroroccurred*/{printf(“errno=%%d\n”,errno);perror(“main”);}錯(cuò)誤處理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院fd=open(“/”,O_WRONLY);//forceadifferenterrorif(fd==-1){printf(“errno=%d\n”,errno);perror(“main”);}/*executeasuccessfulsystemcall*/fd=open(“nonexist.txt”,O_RDONLY|O_CREAT,0644);printf(“errno=%d\n”,errno);//displayaftersuccessfulcallperror(“main”);errno=0;/*manuallyreseterrorvariable*/perror=(“main”);}錯(cuò)誤處理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院例:perror()應(yīng)用執(zhí)行:$./showErrnoerrno=2main:Nosuchfileordirectoryerrno=21main:Isadirectoryerrno=29…evenafterasuccessfulcallmain:Illegalseekmain:Success…afterweresetmanually$_

錯(cuò)誤處理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件管理文件管理基礎(chǔ)文件管理系統(tǒng)調(diào)用能夠操作所有的普通文件、特殊文件和目錄文件,包括:基于磁盤(pán)的文件終端打印機(jī)等設(shè)備進(jìn)程間通信功能,如管道和套接字多數(shù)情況下,最初使用open()訪問(wèn)或創(chuàng)建文件,如果系統(tǒng)調(diào)用成功,則返回一個(gè)稱(chēng)為“文件描述符”的小整數(shù),用于對(duì)該文件的I/O操作。如果open()失敗,返回-1。中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院Linux的文件系統(tǒng)實(shí)現(xiàn)Linux系統(tǒng)中,實(shí)現(xiàn)文件存儲(chǔ)和索引的核心是索引節(jié)點(diǎn)(inode)結(jié)構(gòu)。每個(gè)inode存儲(chǔ)了文件的屬性、訪問(wèn)權(quán)限以及文件數(shù)據(jù)塊的位置。inode是linux系統(tǒng)定位文件的基本途徑。VFS(虛擬文件系統(tǒng)):VFS屏蔽了各種具體的文件分區(qū)格式,使得用戶(hù)程序?qū)ξ募到y(tǒng)的操作不必關(guān)心底層的存儲(chǔ)介質(zhì)和文件系統(tǒng)類(lèi)型的不同。文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件描述符文件描述符從0開(kāi)始按順序編號(hào),前三個(gè)描述符具有特定含義:0標(biāo)準(zhǔn)輸入(stdin)---鍵盤(pán)1標(biāo)準(zhǔn)輸出(stdout)---顯示器2標(biāo)準(zhǔn)錯(cuò)誤(stderr)單個(gè)文件能打開(kāi)幾次,因此它可以有多個(gè)文件描述符文件fd1fd2fd3文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件描述符每個(gè)文件描述符有其專(zhuān)有的屬性集,與它所關(guān)聯(lián)的文件無(wú)關(guān)。這些屬性包括:記錄文件中進(jìn)行讀寫(xiě)操作的偏移量的文件指針;指示如果進(jìn)程調(diào)用exec(),文件描述符是否應(yīng)自動(dòng)關(guān)閉的標(biāo)志;指示對(duì)文件的所有輸出是否應(yīng)追加到文件末尾的標(biāo)志;文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件描述符以下屬性只在文件是管道和套接字這樣的特殊文件時(shí)才有意義:指示如果文件當(dāng)前不包含任何輸入,進(jìn)程是否應(yīng)阻塞來(lái)自該文件的輸入的標(biāo)志;指示如果文件輸入變?yōu)榭捎?,?yīng)發(fā)送一個(gè)SIGIO信號(hào)的進(jìn)程ID或進(jìn)程組的數(shù)字;open(),read(),fcntl()等系統(tǒng)調(diào)用能操作這些標(biāo)志。文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件管理—目錄目錄操作getcwd—獲得當(dāng)前工作目錄#include<unistd.h>char*getcwd(char*buffer,size_tsize)調(diào)用成功把當(dāng)前目錄字符串寫(xiě)到緩沖區(qū)buffer中,并返回指向當(dāng)前工作目錄字符串的指針,如果目錄字符串長(zhǎng)度超出了參數(shù)size給出的緩沖區(qū)長(zhǎng)度,目錄被刪除或者權(quán)限發(fā)生變化,則調(diào)用失敗返回NULL。中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院#include<unistd.h>#include<limits.h>intmain(void){charcur_work_dir[PATH_MAX];inti=0;printf("CurrentMaxPathLengthis:%d\n",PATH_MAX);if(getcwd(cur_work_dir,PATH_MAX)==NULL){perror("Couldn'tgetcurrentworkingdirectory");return1;}printf("CurrentWorkingDirectoryis:");while(cur_work_dir[i]!='\0'){printf("%c",cur_work_dir[i]);i++;}printf("\n");}文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院運(yùn)行結(jié)果:CurrentMaxPathLengthis:4096CurrentWorkingDirectoryis:/root文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院pathconf—獲得系統(tǒng)目錄最大長(zhǎng)度#include<unistd.h>longpathconf(char*path,intname)調(diào)用成功返回目錄相關(guān)的極限值調(diào)用失敗返回-1path可以是包含文件名的路徑,也可以是目錄路徑name的取值可以是:_PC_LINK_MAX_PC_NAME_MAX_PC_PATH_MAX……文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院例:#include<unistd.h>#include<limits.h>#include<iostream.h>intmain(void){longcur_path_len;char*cur_work_dir;if((cur_path_len=pathconf(".",_PC_PATH_MAX))==-1){perror("couldn'tgetcurrentworkingpathlength");return1;}std::cout<<"currentpathlengthis:"<<cur_path_len<<std::endl;文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院if((cur_work_dir=(char*)malloc(cur_path_len))==NULL){perror("couldn'tallocatememoryforthepathname!");return1;}if(getcwd(cur_work_dir,cur_path_len)==NULL){perror("couldn'tgetcurrentworkingdirectory!");return1;}std::cout<<"Currentworkingdirectoryis:"<<cur_work_dir<<std::endl;return0;}運(yùn)行結(jié)果:currentpathlengthis:4096Currentworkingdirectoryis:/root文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院chdir,fchdir—切換當(dāng)前目錄#include<unistd.h>intchdir(constchar*path)intfchdir(intfd)調(diào)用成功返回0,失敗返回-1path指向目錄字符串的指針fd目錄的文件描述符文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院mkdir,rmdir---創(chuàng)建、刪除目錄#include<sys/stat.h>#include<sys/types.h>intmkdir(constchar*pathname,mode_tmode)pathname:要?jiǎng)?chuàng)建的目錄名mode:指定要?jiǎng)?chuàng)建目錄的權(quán)限#include<unistd.h>intrmdir(constchar*pathname)pathname:要?jiǎng)h除的目錄名文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院opendir---打開(kāi)目錄#include<sys/types.h>#include<dirent.h>DIR*opendir(constchar*pathname);

調(diào)用成功打開(kāi)pathname指定的目錄并建立一個(gè)目錄流,返回指向結(jié)構(gòu)體DIR的指針。調(diào)用失敗返回NULL。readdir---獲得打開(kāi)目錄下的具體內(nèi)容structdirent*readdir(DIR*dir);調(diào)用成功返回指向結(jié)構(gòu)體dirent的指針,返回參數(shù)dir目錄流的下個(gè)目錄進(jìn)入點(diǎn)。后續(xù)的readdir將返回后續(xù)的目錄項(xiàng)。調(diào)用失敗或讀取到目錄尾則返回NULL。文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院structdirent{ino_td_ino; off_td_off; unsignedshortd_reclen; unsignedchard_type; chard_name[NAME_MAX+1];}d_ino:當(dāng)前目錄的inode節(jié)點(diǎn)號(hào);d_off:目錄文件首部到下個(gè)dirent結(jié)構(gòu)的位移;d_reclen:該記錄的長(zhǎng)度;d_type:目錄文件類(lèi)型;d_name:目錄文件名;例:獲取指定目錄下的所有文件名和目錄名。p4.9.c,printdir.c,printdir2.c文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院#include<stdio.h>#include<sys/types.h>#include<dirent.h>intmain(void){DIR*dir;structdirent*drt;inti;dir=opendir("/etc/pcmcia");if(dir==NULL){printf("Cannotopenthedesireddirectory");return1;}while((drt=readdir(dir))!=NULL){printf("filenameordirectory:%s\n",drt->d_name);}closedir(dir);return0;}文件管理—目錄中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件管理文件基本操作通過(guò)文件描述符對(duì)文件進(jìn)行操作。例:p4.5.c注意:程序運(yùn)行時(shí),子進(jìn)程與父進(jìn)程之間文件描述符的繼承方式中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院典型的文件操作事件序列intfd;//filedescriptor…fd=open(fileName,…);/*openfile,returnfiledescriptor*/If(fd=-1){/*dealwitherrorcondition*/}…fcntl(fd,…);/*setsomeI/Oflagsifnecessary*/…read(fd,…);/*readfromfile*/…文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院典型的文件操作事件序列write(fd,…);//writetofile…lseek(fd,…);//seekwithinfile…close(fd);//closethefile,freeingfiledescriptor文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院open()----打開(kāi)文件

#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intopen(char*fileName,intmode[,intpermissions])open只能以只讀或讀寫(xiě)方式打開(kāi)或創(chuàng)建文件fileName:一個(gè)絕對(duì)/相對(duì)路徑的文件名;mode:打開(kāi)模式;permissions:文件權(quán)限的八進(jìn)制值,只在文件創(chuàng)建時(shí)需要;文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院open()----打開(kāi)文件permissions可以是幾個(gè)標(biāo)志位按位或后得到。這些標(biāo)志在sys/stat.h中定義。S_IRUSR文件所有者讀權(quán)限S_IWUSR文件所有者寫(xiě)權(quán)限S_IXUSR文件所有者執(zhí)行權(quán)限S_IRGRP文件所屬組讀權(quán)限S_IWGRP文件所屬組寫(xiě)權(quán)限S_IXGRP文件所屬組執(zhí)行權(quán)限

S_IROTH其他用戶(hù)讀權(quán)限S_IWOTH其他用戶(hù)寫(xiě)權(quán)限S_IXOTH其他用戶(hù)執(zhí)行權(quán)限例:open(“myfile”,O_CREAT,S_IRUSR|S_IXOTH)文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院預(yù)定義的讀/寫(xiě)標(biāo)志和混合標(biāo)志的值在”/usr/include/fcntl.h”中定義:O_RDONLY以只讀方式打開(kāi)O_WRONLY以只寫(xiě)方式打開(kāi)O_RDWR以讀寫(xiě)方式打開(kāi)O_APPEND以追加方式打開(kāi)(新寫(xiě)入的數(shù)據(jù)放在文件末尾)O_TRUNC打開(kāi)文件時(shí)將文件長(zhǎng)度設(shè)置為0,丟棄文件已有的內(nèi)容O_CREAT創(chuàng)建文件

O_EXCL和O_CREAT一起使用,防止兩個(gè)程序同時(shí)創(chuàng)建一個(gè)文件……創(chuàng)建文件sprintf(tmpName,”.rev.%d”,getpid());tmpfd=open(tmpName,O_CREAT|O_RDWR,0600)//open中只有O_CREAT模式下mode才有效,文件實(shí)際權(quán)限為mode&(~umask)打開(kāi)已經(jīng)存在的文件fd=open(fileName,O_RDONLY);文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院read()----讀文件#include<unistd.h>ssize_tread(intfd,void*buf,size_tcount)read()從文件描述符fd引用的文件讀取count個(gè)字節(jié)到緩沖區(qū)buf中。調(diào)用成功,read()返回它讀取的字節(jié)數(shù),否則返回-1;如果在已經(jīng)讀取了最后一個(gè)字節(jié)后調(diào)用read(),它返回0,表示到達(dá)了文件末尾。例:

charsRead=read(fd,buffer,BUFFER_SIZE);if(charRead==0)break;//endoffileIf(charRead==-1)fatalError();//error文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院write()----寫(xiě)文件#include<unistd.h>ssize_twrite(intfd,void*buf,size_tcount)write()從緩沖區(qū)buf向文件描述符fd引用的文件復(fù)制count個(gè)字節(jié)的數(shù)據(jù)。數(shù)據(jù)從當(dāng)前文件位置開(kāi)始寫(xiě)入。如果打開(kāi)文件時(shí)設(shè)置為O_APPEND模式,則每次寫(xiě)入時(shí)當(dāng)前文件位置被置為文件末尾,即以追加方式向文件寫(xiě)入數(shù)據(jù)。調(diào)用成功,write()返回它復(fù)制的字節(jié)數(shù),否則返回-1;進(jìn)程應(yīng)該總是檢查返回值,如果返回值不是count,可能磁盤(pán)已寫(xiě)滿。文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院寫(xiě)文件write()例:

/*Copylinetotemporaryfileifreadingfromstdin*/if(standardInput){charsWritten=write(tmpfd,buffer,charsRead);if(charsWritten!=charsRead) fatalError();}文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院lseek()----移動(dòng)文件指針#inlcude<sys/types.h>#include<unistd.h>off_tlseek(intfd,off_toffset,intmode)fd:文件描述符;offset:是一個(gè)長(zhǎng)整數(shù);mode:描述該如何解釋offset?!?usr/include/stdio.h”中定義了mode的三個(gè)取值:SEEK_SEToffset相對(duì)于文件的開(kāi)始SEEK_CURoffset相對(duì)于當(dāng)前文件位置SEEK_ENDoffset相對(duì)于文件末尾如果試圖移動(dòng)文件指針到文件頭之前,lseek()會(huì)失敗。調(diào)用成功,lseek()返回相對(duì)文件頭的當(dāng)前字節(jié)偏移量,調(diào)用失敗返回-1文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件指針移動(dòng)到文件末尾之外會(huì)如何?

off_t

currpos;

currpos=lseek(fd,0,SEEK_CUR);#返回當(dāng)前文件指針偏移量;

如果fd指向的是pipe、FIFO或者socket,lseek返回-1并且置errno為

ESPIPE。中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件管理移動(dòng)文件指針lseek()例:/*Findlineandread*/lseek(fd,lineStart[i],SEEK_SET);charsRead=read(fd,buffer,lineStart[i+1]-lineStart[i]);P5.5.C統(tǒng)計(jì)指定字符串在指定文件中出現(xiàn)的次數(shù)文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院close()----關(guān)閉文件#include<unistd.h>intclose(intfd)調(diào)用成功,close()返回0,否則返回-1。如果fd是打開(kāi)文件關(guān)聯(lián)的最后一個(gè)文件描述符,給該文件分配的內(nèi)核資源將被收回。當(dāng)一個(gè)進(jìn)程結(jié)束時(shí),它所有的文件描述符都會(huì)自動(dòng)關(guān)閉,但提倡當(dāng)完成文件操作時(shí)關(guān)閉文件。如果關(guān)閉一個(gè)已經(jīng)關(guān)閉的文件,會(huì)發(fā)生錯(cuò)誤。當(dāng)文件關(guān)閉時(shí),不保證文件緩沖區(qū)立即清空到磁盤(pán)。例:close(fd);/*Closeinputfile*/文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院刪除文件unlink()函數(shù)定義:intunlink(constchar*fileName)unlink()刪除從文件名finleName指向文件的鏈接。如果fileName是指向文件的最后一個(gè)硬鏈接,文件的資源被收回。如果調(diào)用成功,unlink()返回0,否則返回-1。例:

/*Removetempfile*/if(standardInput)unlink(tmpName);文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件管理實(shí)例—reverse.c例:reverse-c[fileName]reverse將輸入文件的各行逆序顯示在標(biāo)準(zhǔn)輸出上。如果不指定文件名,則逆序顯示標(biāo)準(zhǔn)輸入的內(nèi)容。當(dāng)使用-c選項(xiàng)時(shí),reverse還顛倒每一行中的字符。$gccreverse.c-oreverse$cattestChirstmasiscoming,Thedaysthatgrowshorter.$./reverse–ctest.retrohsworgthatsyadehT,gnimocsisamtsrihC文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院reverse的工作過(guò)程步驟操作函數(shù)系統(tǒng)調(diào)用分析命令行parseCommmandLine,openprocessOptions

打開(kāi)輸入文件或讀取標(biāo)準(zhǔn)輸入,創(chuàng)pass1open

建存儲(chǔ)輸入的臨時(shí)文件讀取文件,把各行的起始pass1,trackLinesread

偏移量保存在數(shù)組中反向讀取文件,把每行復(fù)制pass2,processLine,lseek

到標(biāo)準(zhǔn)輸出,如果選擇-c,reverseLine

字符也會(huì)逆序輸出。關(guān)閉文件,如果是臨時(shí)文件,pass2close

刪除臨時(shí)文件文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院其他文件管理系統(tǒng)調(diào)用名稱(chēng)功能opendir()打開(kāi)目錄readdir()讀目錄closedir()關(guān)閉目錄chown()改變文件所有者和文件組chmod()改變文件權(quán)限dup()復(fù)制文件描述符dup2同dupfcntl()對(duì)各種文件特性的訪問(wèn)stat()獲取文件信息文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院其他文件管理系統(tǒng)調(diào)用名稱(chēng)功能sync調(diào)度所有文件緩沖區(qū)清空到磁盤(pán)mknod創(chuàng)建特殊文件link創(chuàng)建硬鏈接symlink創(chuàng)建符號(hào)鏈接ioctl控制設(shè)備truncate截短文件ftruncate同truncate文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院其他文件管理系統(tǒng)調(diào)用intchown(constchar*path,uid_towner,gid_tgroup);用戶(hù)ID和組ID(owner和group)可以通過(guò)getuid()和getgid()獲得,如果參數(shù)owner或group為-1,表示對(duì)應(yīng)的所有者或組不會(huì)改變。例1:把文件test.txt的組改為cs,該組的組ID為62/*mychown.c*/main(){intflag;flag=chown("test.txt",-1,62);/*LeaveuserIDunchanged*/if(flag==-1)perror("chown.c");}$ls-ltest.txt-rw-r--r--1glassmusic3May2511:42test.txt$ls-ltest.txt-rw-r--r--1glasscs3May2511:42test.txt文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院其他文件管理系統(tǒng)調(diào)用intchmod(constchar*path,mode_tmode);

例2:把文件test.txt的權(quán)限標(biāo)志改為600/*mychomod.c*/main(){intflag;flag=chmod("test.txt",0600);/*Useanoctalencoding*/if(flag==-1)perror("chmod.c");}$ls-ltest.txt-rw-r--r--1glassmusic3May2511:42test.txt$ls-ltest.txt-rw-------1glasscs3May2511:42test.txt文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院獲得文件信息stat()#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>intfstat(intfd,

structstat*statbuf)返回與打開(kāi)的文件描述符相關(guān)的文件的狀態(tài)信息,該信息寫(xiě)到structstat結(jié)構(gòu)中intstat(constchar*pathname,structstat*statbuf)intlstat(constchar*pathname,structstat*statbuf)stat和lstat是通過(guò)文件名查到文件狀態(tài)信息,它們產(chǎn)生的結(jié)果相同。但當(dāng)文件是一個(gè)符號(hào)鏈接時(shí),lstat返回的是該符號(hào)鏈接本身的信息,而stat返回的是該鏈接所指向的文件的信息。調(diào)用成功返回0,失敗返回-1文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院structstat{ dev_t st_dev; ino_t st_ino; mode_t st_mode; nlink_t st_nlink; uid_t st_uid; gid_t st_gid; dev_t st_rdev; off_t st_size; unsignedlong st_blksize; unsignedlong st_blocks; time_t st_atime; time_t st_mtime; time_t st_ctime;}文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院st_dev:文件所處的磁盤(pán)設(shè)備ID號(hào);st_ino:文件的inode索引號(hào);st_mode:文件訪問(wèn)權(quán)限和文件類(lèi)型;st_nlink:文件的硬鏈接數(shù);st_uid:文件所屬的用戶(hù)ID;st_gid:文件所屬的組ID;st_rdev:如果文件是字符或塊設(shè)備,該值給出該設(shè)備的標(biāo)識(shí)符信息;st_size:對(duì)常規(guī)文件,該值為文件大?。粚?duì)符號(hào)鏈接,該值為該符號(hào)鏈接所指向的目錄長(zhǎng)度;對(duì)設(shè)備文件,該值為0;st_blksize:文件系統(tǒng)存儲(chǔ)文件的塊大小;st_blocks:分配給文件的塊數(shù);st_atime:文件的最近訪問(wèn)時(shí)間;st_mtime:文件內(nèi)容的最近修改時(shí)間;st_ctime:文件屬性的最近修改時(shí)間;文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院st_mode:文件訪問(wèn)權(quán)限和文件類(lèi)型;sys/stat.h中提供了POSIX標(biāo)準(zhǔn)的一些宏用于對(duì)文件類(lèi)型、文件訪問(wèn)權(quán)限以及用于幫助測(cè)試特定類(lèi)型和權(quán)限的掩碼的定義。文件訪問(wèn)權(quán)限標(biāo)志同open系統(tǒng)調(diào)用。用于判定文件類(lèi)型的宏:

S_ISLNK(st_mode)判斷是否為符號(hào)連接

S_ISREG(st_mode)是否為一般文件

S_ISDIR(st_mode)是否為目錄

S_ISCHR(st_mode)是否為字符裝置文件

S_ISBLK(st_mode

)是否為先進(jìn)先出

S_ISSOCK(st_mode)是否為socket用于解釋st_mode的掩碼:S_IFMT:文件類(lèi)型S_IRWXU:文件所有者的讀/寫(xiě)/執(zhí)行權(quán)限;S_IRWXG:文件所屬組用戶(hù)的的讀/寫(xiě)/執(zhí)行權(quán)限;S_IRWXO:其他用戶(hù)的的讀/寫(xiě)/執(zhí)行權(quán)限;

文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院

例:測(cè)試一個(gè)文件不是目錄,并設(shè)置了owneruser的執(zhí)行權(quán)限stat(“filename”,&statbuf);mode=statbuf.st_mode;if(!S_ISDIR(mode)&&(mode&S_IRWXU)==S_IXUSR)文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件類(lèi)型標(biāo)志:

S_IFBLK文件是一個(gè)塊設(shè)備

S_IFDIR文件是一個(gè)目錄

S_IFCHR文件是一個(gè)字符設(shè)備

S_IFIFO文件是一個(gè)FIFO(命名管道)

S_IFREG文件是一個(gè)普通文件

S_IFLNK文件是一個(gè)符號(hào)鏈接

例:判斷文件類(lèi)型stat(“filename”,&statbuf);mode=statbuf.st_mode;if((mode&S_IFMT)==S_IFDIR)//目錄 printf("Directory\t");elseif((mode&S_IFMT)==S_IFBLK)//塊文件 printf("Blockspecialfile\t");elseif((mode&S_IFMT)==S_IFCHR)//特殊字符文件 printf("characterspecialfile\t");elseif((mode&S_IFMT)==S_IFREG)//普通文件 printf("Ordinaryfile\t");elseif((mode&S_IFMT)==S_IFIFO)//管道文件 printf("pipefilefile\t");printf(“Permission:%o\n”,mode&0x1ff);文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件訪問(wèn)權(quán)限的獲取:printf("Permission:%o\n",mode&0x1ff);mode是一個(gè)無(wú)符號(hào)整型,一共有16位,前面7位用來(lái)表示文件類(lèi)型,可用掩碼按位與確定,后面9位為權(quán)限,分別是用戶(hù)權(quán)限,組權(quán)限,其他權(quán)限,把后9位用0x1ff(111111111)做位運(yùn)算&就能獲得文件權(quán)限值。

文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院例:stat系統(tǒng)調(diào)用的應(yīng)用。

statapply.c文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院chmod,fchmod----修改文件權(quán)限#include<sys/types.h>#include<sys/stat.h>intchmod(constchar*path,mode_tmode);path文件或目錄所在的路徑;調(diào)用成功返回0,調(diào)用失敗返回-1;intfchmod(intfd,mode_tmode);文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院chmod,fchmod中使用的宏S_ISUID設(shè)置用戶(hù)權(quán)限S_ISGID設(shè)置組用戶(hù)權(quán)限S_IRUSR文件所有者的讀權(quán)限S_IWUSR文件所有者的寫(xiě)權(quán)限S_IXUSR文件所有者的執(zhí)行權(quán)限……

文件訪問(wèn)權(quán)限標(biāo)志與open函數(shù)使用的相同例:p4.7.c#defineS_IRWXU00700

#defineS_IRUSR00400

#defineS_IWUSR00200

#defineS_IXUSR00100

#defineS_IRWXG00070

#defineS_IRGRP00040

#defineS_IWGRP00020

#defineS_IXGRP00010

#defineS_IRWXO00007

#defineS_IROTH00004

#defineS_IWOTH00002

#defineS_IXOTH00001

文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院chown,fchown,lchown---改變文件所有者#include<sys/types.h>#include<unistd.h>intchown(constchar*path,uid_towner,gid_tgroup);path文件或目錄的路徑;調(diào)用成功返回0,調(diào)用失敗返回-1;只有超級(jí)用戶(hù)才能調(diào)用該函數(shù)。用戶(hù)ID號(hào)和組ID號(hào)(owner和group)可以通過(guò)getuid()和getgid()獲得。文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院umask----修改默認(rèn)權(quán)限當(dāng)新建一個(gè)文件或目錄時(shí),linux系統(tǒng)會(huì)根據(jù)(設(shè)定權(quán)限-umask值)來(lái)決定新建文件或目錄的權(quán)限;umask表示要關(guān)閉哪些權(quán)限,root的缺省umask是022,一般用戶(hù)是002;新建文件默認(rèn)訪問(wèn)權(quán)限是666,目錄權(quán)限是777。在創(chuàng)建文件或目錄時(shí),系統(tǒng)把默認(rèn)權(quán)限的值與umask的值相減,即得到新建文件的訪問(wèn)權(quán)限。例如:系統(tǒng)為root用戶(hù)創(chuàng)建了一個(gè)新文件,那么新文件的權(quán)限644,而目錄則為755。如果用戶(hù)的umask為000,則創(chuàng)建的文件權(quán)限為666,目錄權(quán)限為777,

運(yùn)行umask命令可以查看用戶(hù)自己的umask值。

文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院umask----修改默認(rèn)權(quán)限umask函數(shù)可以修改umask值;#include<sys/types.h>#include<sys/stat.h>mode_tumask(mode_tmask);例:p4.8.c文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院硬鏈接和軟鏈接(符號(hào)鏈接)1)硬鏈接:指向inode節(jié)點(diǎn)的鏈接;ln命令可以創(chuàng)建硬鏈接;$lnlink.testnewlink12)軟鏈接(符號(hào)鏈接):指向文件名的鏈接;$ln–slink.symbolnewlink23)只有文件才能創(chuàng)建硬鏈接,目錄不能創(chuàng)建硬鏈接;硬鏈接不能跨文件系統(tǒng);4)只有文件所有的硬鏈接被刪除,該文件才能真正被刪除;5)符號(hào)鏈接可以跨文件系統(tǒng);符號(hào)鏈接不影響文件的刪除;文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院硬鏈接和軟鏈接(符號(hào)鏈接) $touchf1

#創(chuàng)建一個(gè)測(cè)試文件f1 $lnf1f2

#創(chuàng)建f1的一個(gè)硬鏈接文件f2 $ln-sf1f3

#創(chuàng)建f1的一個(gè)符號(hào)鏈接文件f3 $ls-li

#-i參數(shù)顯示文件的inode節(jié)點(diǎn)信息

total0

9797648-rw-r--r--

2

oracle

oinstall0Apr2108:11f1

9797648-rw-r--r--

2oracleoinstall0Apr2108:11f2

9797649lrwxrwxrwx

1oracleoinstall2Apr2108:11f3->f1

從上面的結(jié)果中可以看出,硬鏈接文件f2與原文件f1的inode節(jié)點(diǎn)相同,均為9797648,然而符號(hào)鏈接文件的inode節(jié)點(diǎn)不同。中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院文件管理link---創(chuàng)建硬鏈接#include<unistd.h>intlink(constchar*oldpath,constchar*newpath);調(diào)用成功返回0,調(diào)用失敗返回-1;symlink---創(chuàng)建符號(hào)鏈接#include<unistd.h>intsymlink(constchar*oldpath,constchar*newpath);unlink---刪除鏈接#include<unistd.h>intunlink(constchar*path);文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院綜合實(shí)例:定制自己的ls命令。

p4.10.c打開(kāi)目錄獲得該目錄下的所有文件列表將文件列表存入一個(gè)鏈表中遍歷鏈表,對(duì)每個(gè)文件調(diào)用stat輸出每個(gè)文件信息打開(kāi)目錄信息輸出文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院其他文件管理系統(tǒng)調(diào)用#include<unistd.h>intdup(intfd);intdup2(intoldfd,intnewfd);dup()和dup2()函數(shù)用于復(fù)制打開(kāi)的文件描述符。dup()返回當(dāng)前進(jìn)程最小的未使用的文件描述符。dup2()函數(shù)中指定的newfd如果已經(jīng)使用,將先被關(guān)閉,再進(jìn)行復(fù)制。

文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院其他文件管理系統(tǒng)調(diào)用例3:創(chuàng)建一個(gè)文件test.txt,然后通過(guò)4個(gè)不同的文件描述符寫(xiě)這個(gè)文件。/*mydup.c*/#include<stdio.h>#include<fcntl.h>main(){intfd1,fd2,fd3;

fd1=open("test.txt",O_RDWR|O_TRUNC);printf("fd1=%d\n",fd1);write(fd1,"what's",6);

fd2=

dup(fd1);/*Makeacopyoffd1*/printf("fd2=%d\n",fd2);write(fd2,"up",3);

close(0);/*Closestandardinput*/

文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院其他文件管理系統(tǒng)調(diào)用例3:續(xù)fd3=dup(fd1);/*Makeanothercopyoffd1*/printf("fd3=%d\n",fd3);

write(0,"doc",4);

dup2(3,2);/*Duplicatechannel3tochannel2*/

write(2,"?\n",2);}思考:程序運(yùn)行的結(jié)果?文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院標(biāo)準(zhǔn)I/O庫(kù)(stdio.h)

標(biāo)準(zhǔn)I/O庫(kù)提供復(fù)雜函數(shù)用于格式化I/O和滿足設(shè)備的緩沖需求,用于為底層I/O系統(tǒng)調(diào)用提供一個(gè)通用接口。

標(biāo)準(zhǔn)I/O庫(kù)中,與底層文件描述符對(duì)應(yīng)的是流(stream),它被實(shí)現(xiàn)為指向結(jié)構(gòu)FILE的指針。

每個(gè)文件流都跟一個(gè)底層文件描述符關(guān)聯(lián)。

進(jìn)程創(chuàng)建時(shí),有3個(gè)文件流自動(dòng)打開(kāi):stdin、stdout、stderr。它們與底層文件描述符0,1,2對(duì)應(yīng),在stdio.h中被定義。文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院標(biāo)準(zhǔn)I/O庫(kù)函數(shù)fopen、fclosefread、fwritefgetc、getc、getcharfputc、putc、putcharfgets、getsprintf、fprintf、sprintfscanf、fscanf、sscanf文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院標(biāo)準(zhǔn)I/O庫(kù)函數(shù)與系統(tǒng)調(diào)用運(yùn)行效率的對(duì)比

copy_system.c系統(tǒng)調(diào)用,每次讀一個(gè)字符(LPP87) copy_block.c系統(tǒng)調(diào)用,每次讀一個(gè)block(LPP88) copy_stdio.c庫(kù)函數(shù)調(diào)用,F(xiàn)ILE內(nèi)部緩沖區(qū)滿時(shí)才進(jìn)行底層系統(tǒng)調(diào)用(LPP98)$TIMEFORMAT=……$time./copy_***對(duì)比運(yùn)行時(shí)間文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院/proc文件系統(tǒng) /proc是一個(gè)特殊的目錄,它映射到linux提供的一個(gè)特殊的文件系統(tǒng)procfs,用來(lái)實(shí)現(xiàn)對(duì)底層的設(shè)備驅(qū)動(dòng)程序和內(nèi)核信息進(jìn)行更高層次的訪問(wèn)。文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院/proc文件系統(tǒng)的內(nèi)容

/proc下以數(shù)字命名的子目錄用于提供進(jìn)程的信息; /proc/modules所有加載到內(nèi)核的模塊列表 /proc/mounts系統(tǒng)中使用的所有掛載 /proc/partitions分區(qū)中的塊分配信息 /proc/stat所有的CPU活動(dòng)信息 /proc/versionLinux內(nèi)核版本和gcc版本 /proc/fs文件系統(tǒng)信息 /proc/cpuinfocpu的詳細(xì)信息 /proc/net網(wǎng)卡設(shè)備信息 /proc/ttytty設(shè)備信息直接讀取這些文件內(nèi)容就能獲得狀態(tài)信息(例如cat顯示)超級(jí)用戶(hù)可以通過(guò)寫(xiě)/proc下的文件來(lái)修改系統(tǒng)參數(shù)文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院fcntl系統(tǒng)調(diào)用對(duì)打開(kāi)的文件描述符執(zhí)行各種操作,包括對(duì)它們的復(fù)制、獲取和設(shè)置文件描述符標(biāo)志、獲取和設(shè)置文件狀態(tài)標(biāo)志,以及管理建議性文件鎖等。#include<fcntl.h>intfcntl(intfd,intcmd);intfcntl(intfd,intcmd,longarg);intfcntl(intfd,intcmd,structflock*lock);對(duì)不同操作的選擇是通過(guò)選取命令參數(shù)cmd不同的值來(lái)實(shí)現(xiàn)的,其取值定義在fcntl.h中。根據(jù)所選擇的命令的不同,決定是否需要第三個(gè)參數(shù)。文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院fcntl系統(tǒng)調(diào)用fcntl系統(tǒng)調(diào)用有5種功能:

1.復(fù)制一個(gè)現(xiàn)有的描述符(cmd=F_DUPFD).

2.獲得/設(shè)置文件描述符標(biāo)記(cmd=F_GETFD或F_SETFD).

3.獲得/設(shè)置文件狀態(tài)標(biāo)記(cmd=F_GETFL或F_SETFL).

4.獲得/設(shè)置異步I/O所有權(quán)(cmd=F_GETOWN或F_SETOWN).

5.獲得/設(shè)置記錄鎖(cmd=F_GETLK,F_SETLK或F_SETLKW).文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院fcntl系統(tǒng)調(diào)用fcntl()的返回值與命令有關(guān)。如果出錯(cuò),所有命令都返回-1,如果成功則返回某個(gè)其他值。下列命令有特定返回值:

F_DUPFD

返回新的文件描述符

F_GETFD

返回相應(yīng)標(biāo)志

F_GETFL,F_GETOWN

返回一個(gè)正的進(jìn)程ID或負(fù)的進(jìn)程組ID文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院cmd=F_DUPFD

返回一個(gè)如下描述的(文件)描述符:

·最小的大于或等于arg的一個(gè)可用的描述符

·與原始操作符一樣的某對(duì)象的引用

·如果對(duì)象是文件(file)的話,則返回一個(gè)新的描述符,這個(gè)描述符與arg共享相同的偏移量(offset)

·相同的訪問(wèn)模式(讀,寫(xiě)或讀/寫(xiě))

·相同的文件狀態(tài)標(biāo)志 ·新文件描述符的close-on-exec標(biāo)志被設(shè)置為交叉式訪問(wèn)

dup(oldfd);

等效于

fcntl(oldfd,F_DUPFD,0);文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院cmd=F_GETFD和F_SETFD

F_GETFD

獲得與文件描述符fd關(guān)聯(lián)的close-on-exec標(biāo)志,類(lèi)似FD_CLOEXEC。如果返回值和FD_CLOEXEC進(jìn)行與運(yùn)算結(jié)果是0的話,文件保持交叉式訪問(wèn)exec(),否則如果通過(guò)exec運(yùn)行的話,文件將被關(guān)閉(arg被忽略)

F_SETFD

設(shè)置close-on-exec標(biāo)志,該標(biāo)志以參數(shù)arg的FD_CLOEXEC位決定,通常不使用常數(shù)FD_CLOEXEC,而是將此標(biāo)志設(shè)置為0(系統(tǒng)默認(rèn)值,exec時(shí)不關(guān)閉)或1(exec時(shí)關(guān)閉)

文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院cmd=F_GETFL和F_SETFLF_GETFL

取得fd的文件狀態(tài)標(biāo)志,(O_RDONLY,O_WRONLY,O_RDWR)需要用屏蔽字O_ACCMODE相與取得存取方式位,然后將結(jié)果與三個(gè)常量比較進(jìn)行判定。F_SETFL

設(shè)置描述符狀態(tài)標(biāo)志

O_NONBLOCK

非阻塞I/O

O_APPEND

強(qiáng)制每次寫(xiě)(write)操作都添加在文件的末尾

O_DIRECT

最小化或去掉reading和writing的緩存影響

O_ASYNC

當(dāng)I/O可用的時(shí)候,允許SIGIO信號(hào)發(fā)送到進(jìn)程組,例如:當(dāng)有數(shù)據(jù)可以讀的時(shí)候例:獲取文件描述符屬性。getfdinfo.c文件管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院設(shè)備文件概述linux系統(tǒng)中,所有的設(shè)備都以特殊文件的形式存在。在/dev目錄下保存了指向系統(tǒng)中硬件的特殊文件。程序可以像訪問(wèn)普通文件一樣來(lái)訪問(wèn)硬件,無(wú)需使用特殊的接口函數(shù)。設(shè)備類(lèi)型:字符設(shè)備以字節(jié)流訪問(wèn)的設(shè)備塊設(shè)備以塊為單位進(jìn)行讀寫(xiě)操作的設(shè)備網(wǎng)絡(luò)接口主設(shè)備號(hào)和從設(shè)備號(hào):內(nèi)核通過(guò)主從設(shè)備號(hào)將設(shè)備文件與真實(shí)的設(shè)備關(guān)聯(lián)起來(lái)。由同一個(gè)設(shè)備驅(qū)動(dòng)控制的所有設(shè)備具有相同的主設(shè)備號(hào);從設(shè)備號(hào)用以區(qū)分相同的設(shè)備驅(qū)動(dòng)控制的不同子設(shè)備。文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院重要的設(shè)備文件/dev/console系統(tǒng)控制臺(tái)。錯(cuò)誤信息和診斷信息被發(fā)送到這里。/dev/tty控制終端的別名(邏輯設(shè)備)。/dev/null空設(shè)備。所有寫(xiě)往這個(gè)設(shè)備的輸出都被丟棄,讀這個(gè)設(shè)備會(huì)立即返回一個(gè)EOF標(biāo)志。文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院linux設(shè)備驅(qū)動(dòng)工作流程Linux系統(tǒng)啟動(dòng)時(shí),設(shè)備驅(qū)動(dòng)將被加載;設(shè)備驅(qū)動(dòng)加載成功后,向系統(tǒng)反饋一個(gè)主設(shè)備號(hào),驅(qū)動(dòng)程序?qū)⒏鶕?jù)該主設(shè)備號(hào)在/dev目錄下創(chuàng)建對(duì)應(yīng)的設(shè)備文件。之后,用戶(hù)程序就可以利用open(),read(),write()等函數(shù)或命令,通過(guò)設(shè)備文件實(shí)現(xiàn)對(duì)設(shè)備的訪問(wèn)。文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院Linux終端設(shè)備用戶(hù)與主機(jī)交互的設(shè)備稱(chēng)為終端設(shè)備。Linux系統(tǒng)中所有終端設(shè)備被稱(chēng)為tty。是字符設(shè)備。Linux中的終端設(shè)備文件類(lèi)型:串行端口終端(/dev/ttySn):分別對(duì)應(yīng)于COM1,COM2,……,COMn口;偽終端(/dev/pts/n):使用telet登錄到linux系統(tǒng)控制終端(dev/tty):當(dāng)前進(jìn)程的控制終端控制臺(tái)終端(dev/tty,/dev/console):linux將顯示器稱(chēng)為控制臺(tái)終端,用于接收和輸出控制臺(tái)信息。默認(rèn)有tty1~tty6,tty7~tty8。文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院與終端的交互#include<unistd.h>intisatty(intfd);

若fd為終端設(shè)備則返回1,否則返回0intfileno(FILE*stream);

返回和stream文件流對(duì)應(yīng)的文件描述符。如果失敗,返回-1例:menu1.c(LPP144)menu2.c程序中與用戶(hù)交互的部分不允許重定向,其他部分允許重定向。(LPP148)menu3.c將程序中與用戶(hù)交互的部分與stdin,stdout分開(kāi),直接讀寫(xiě)終端。(LPP149)文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院ttyname()----獲得當(dāng)前終端名稱(chēng)#include<unistd.h>char*ttyname(intfd)調(diào)用成功返回打開(kāi)的文件描述符fd對(duì)應(yīng)的終端名稱(chēng);調(diào)用失敗返回NULL;例:p6.1.c文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院tcgetattr()----獲得終端相關(guān)參數(shù)tcsetattr()----設(shè)置終端相關(guān)參數(shù)#include<unistd.h>#include<termios.h>inttcgetattr(intfd,structtermios*termios_p);inttcsetattr(intfd,intoptional_actions,consttermios*termios_p);調(diào)用成功返回0;調(diào)用失敗返回-1;optional_actions用來(lái)指定什么時(shí)候新的終端屬性起作用;TCSANOW立即作用TCSADRAIN發(fā)送了所有輸出后才作用TCSAFLUSH發(fā)送了所有輸出后作用,且更改發(fā)生時(shí)未讀取的所有輸入數(shù)據(jù)都被清除(FLUSH)文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院structtermios{

tcflag_tc_iflag;

tcflag_tc_oflag;

tcflag_tc_cflag;

tcflag_tc_lflag;

cc_t

c_cc[NCCS];

}; c_iflag輸入模式

c_oflag輸出模式

c_cflag控制模式

c_lflag本地模式:可以設(shè)置(非/標(biāo)準(zhǔn)模式)/密碼不顯示~ECHO

c_cc特殊的控制字符

通過(guò)termios結(jié)構(gòu)可以對(duì)終端接口進(jìn)行控制

輸入模式,輸出模式,控制模式,本地模式,特殊控制字符

文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院c_oflag

OPOST

啟用具體實(shí)現(xiàn)自行定義的輸出。OLCUC

(不屬于POSIX)將輸出中的小寫(xiě)字母映射為大寫(xiě)字母。ONLCR(XSI)將輸出中的新行符映射為回車(chē)-換行OCRNL

將輸出中的回車(chē)映射為新行符。ONOCR不在第0列輸出回車(chē)。ONLRET不輸出回車(chē)。OFILL

發(fā)送填充字符作為延時(shí)。OFDEL

(不屬于POSIX)填充字符是ASCIIDEL(0177)。如果不設(shè)置填充字符則是ASCIINUL。NLDLY

新行延時(shí)掩碼。取值為NL0和NL1。CRDLY回車(chē)延時(shí)掩碼。取值為CR0,CR1,CR2或CR3。TABDLY水平跳格延時(shí)掩碼。取值為T(mén)AB0,TAB1,TAB2,TAB3(或XTABS)。取值為T(mén)AB3,即XTABS,將擴(kuò)展跳格為空格(每個(gè)跳格符填充8個(gè)空格)。BSDLY回車(chē)延時(shí)掩碼。取值為BS0或BS1.(從來(lái)沒(méi)有被實(shí)現(xiàn))VTDLY

豎直跳格掩碼。取值為VT0或VT1。FFDLY

進(jìn)表延時(shí)掩碼。取值為FF0或者FF1。文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院c_iflag

GNBRK

忽略輸入中的BREAK狀態(tài)BRKINT

如果設(shè)置了IGNBRK,將忽略BREAK。如果沒(méi)有設(shè)置,但是設(shè)置了BRKINT,那么BREAK將使得輸入和輸出隊(duì)列被刷新,如果終端是一個(gè)前臺(tái)進(jìn)程組的控制終端,這個(gè)進(jìn)程組中所有進(jìn)程將收到SIGINT信號(hào)。如果既未設(shè)置IGNBRK也未設(shè)置BRKINT,BREAK將視為NUL同義字符,除非設(shè)置了PARMRK,這種情況下被視為序列\(zhòng)377\0\0IGNPAR

忽略幀錯(cuò)誤和奇偶校驗(yàn)錯(cuò)誤PARMRK如果沒(méi)有設(shè)置IGNPAR,在有奇偶校驗(yàn)錯(cuò)誤或者楨錯(cuò)誤的字符前插入\377\0。如果既沒(méi)有設(shè)置IGNPAR也沒(méi)有設(shè)置PARMRK,將所有奇偶校驗(yàn)錯(cuò)誤或者幀錯(cuò)誤的字符視為\0。INPCK啟用輸入奇偶校驗(yàn)檢測(cè)。ISTRIP

去掉第八位。INLCR

將輸入的NL翻譯為CR。IGNCR

忽略輸入中的回車(chē)。ICRNL

將輸入中的回車(chē)翻譯為新行字符(除非設(shè)置了IGNCR)。文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院c_cflag

CBAUD

(不屬于POSIX)波特率掩碼(4+1位)。CBAUDEX(不屬于POSIX)擴(kuò)展的波特率掩碼(1位),包含在CBAUD中。CSIZE

字符長(zhǎng)度掩碼。取值為CS5,CS6,CS7或CS8。CSTOPB

設(shè)置兩個(gè)停止位。(默認(rèn)為1個(gè))

CREAD啟用接收,可以接收字符。

PARENB啟用奇偶校驗(yàn)。PARODD輸入和輸出是奇校驗(yàn)HUPCL

在最后一個(gè)進(jìn)程關(guān)閉設(shè)備后,降低MODEM控制線(掛斷)。CLOCAL

忽略MODEM控制線。LOBLK(不屬于POSIX)從非當(dāng)前SHELL層阻塞輸出(用于sh1)。CIBAUD(不屬于POSIX)輸入速度的掩碼。CIBAUD各位的值與CBAUD各位相同,左移了IBSHIFT位。CRTSCTS

(不屬于POSIX)啟用RTS/CTS(硬件)控制流。文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院c_lflag

ICANON用于實(shí)現(xiàn)規(guī)范輸入,即read()讀到行結(jié)束符后返回,常用于終端的處理;若串口用于發(fā)送/接收數(shù)據(jù),則應(yīng)清除此標(biāo)志,使用非規(guī)范模式(raw

mode)。非規(guī)范模式中,輸入數(shù)據(jù)不組成行,不處規(guī)范模式中的特殊字符。ISIG當(dāng)接收到字符INTR,QUIT,SUSP或DSUSP時(shí),產(chǎn)生相應(yīng)的信號(hào)。ECHO

回顯輸入字符。ECHOE

如果同時(shí)設(shè)置了ICANON,字符ERASE擦除前一個(gè)輸入字符,WERASE擦除前一個(gè)詞。ECHOK如果同時(shí)設(shè)置了ICANON,字符KILL刪除當(dāng)前行。ECHONL

如果同時(shí)設(shè)置了ICANON,回顯字符NL,即使沒(méi)有設(shè)置ECHO。NOFLSH禁止產(chǎn)生SIGINT,SIGQUIT和SIGSUSP信號(hào)時(shí)刷新輸入和輸出隊(duì)列。TOSTOP

向試圖寫(xiě)控制終端的后臺(tái)進(jìn)程組發(fā)送SIGTTOU信號(hào)。PENDIN(不屬于POSIX;LINUX不支持)在讀入一個(gè)字符時(shí),輸入隊(duì)列中的所有字符被重新輸出。(bash用他來(lái)處理typeahead)。IEXTEN啟用實(shí)現(xiàn)自定義的輸入處理。這個(gè)標(biāo)志必須與ICANON同時(shí)使用,才能解釋特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC標(biāo)志才有效。文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院c_cc數(shù)組

在非規(guī)范模式中,c_cc[VMIN]和c_cc[VTIME]用于設(shè)置read()返回前讀到的最少字節(jié)數(shù)和讀超時(shí)時(shí)間,其值分為四種情況:

c_cc[VMIN]>0,c_cc[VTIME]>0

讀到一個(gè)字節(jié)后,啟動(dòng)定時(shí)器,其超時(shí)時(shí)間為c_cc[VTIME],read()返回的條件為至少讀到c_cc[VMIN]個(gè)字符或定時(shí)器超期。c_cc[VMIN]>0,

c_cc[VTIME]

==0

只要讀到數(shù)據(jù)的字節(jié)數(shù)大于等于c_cc[VMIN],則read()返回;否則,將無(wú)限期阻塞等待。c_cc[VMIN]

==

0,

c_cc[VTIME]>0

只要讀到數(shù)據(jù),則read()返回;若定時(shí)器超期(定時(shí)時(shí)間c_cc[VTIME])卻未讀到數(shù)據(jù),則read()返回0;c_cc[VMIN]

==

0,

c_cc[VTIME]

==

0

若有數(shù)據(jù),則read()讀取指定數(shù)量的數(shù)據(jù)后返回;若沒(méi)有數(shù)據(jù),則read()返回0;

文件管理—設(shè)備管理中國(guó)地質(zhì)大學(xué)(武漢)計(jì)算機(jī)學(xué)院例:密碼輸入關(guān)閉回顯

#i

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論