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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

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

off_t

currpos;

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

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

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

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

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

建存儲輸入的臨時文件讀取文件,把各行的起始pass1,trackLinesread

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

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

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

刪除臨時文件文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院其他文件管理系統(tǒng)調(diào)用名稱功能opendir()打開目錄readdir()讀目錄closedir()關(guān)閉目錄chown()改變文件所有者和文件組chmod()改變文件權(quán)限dup()復(fù)制文件描述符dup2同dupfcntl()對各種文件特性的訪問stat()獲取文件信息文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院其他文件管理系統(tǒng)調(diào)用名稱功能sync調(diào)度所有文件緩沖區(qū)清空到磁盤mknod創(chuàng)建特殊文件link創(chuàng)建硬鏈接symlink創(chuàng)建符號鏈接ioctl控制設(shè)備truncate截短文件ftruncate同truncate文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院其他文件管理系統(tǒng)調(diào)用intchown(constchar*path,uid_towner,gid_tgroup);用戶ID和組ID(owner和group)可以通過getuid()和getgid()獲得,如果參數(shù)owner或group為-1,表示對應(yīng)的所有者或組不會改變。例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文件管理中國地質(zhì)大學(xué)(武漢)計算機學(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文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院獲得文件信息stat()#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>intfstat(intfd,

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

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

S_ISREG(st_mode)是否為一般文件

S_ISDIR(st_mode)是否為目錄

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

S_ISBLK(st_mode

)是否為先進先出

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

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

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

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

S_IFDIR文件是一個目錄

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

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

S_IFREG文件是一個普通文件

S_IFLNK文件是一個符號鏈接

例:判斷文件類型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);文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院文件訪問權(quán)限的獲取:printf("Permission:%o\n",mode&0x1ff);mode是一個無符號整型,一共有16位,前面7位用來表示文件類型,可用掩碼按位與確定,后面9位為權(quán)限,分別是用戶權(quán)限,組權(quán)限,其他權(quán)限,把后9位用0x1ff(111111111)做位運算&就能獲得文件權(quán)限值。

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

statapply.c文件管理中國地質(zhì)大學(xué)(武漢)計算機學(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);文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院chmod,fchmod中使用的宏S_ISUID設(shè)置用戶權(quán)限S_ISGID設(shè)置組用戶權(quán)限S_IRUSR文件所有者的讀權(quán)限S_IWUSR文件所有者的寫權(quán)限S_IXUSR文件所有者的執(zhí)行權(quá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

文件管理中國地質(zhì)大學(xué)(武漢)計算機學(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;只有超級用戶才能調(diào)用該函數(shù)。用戶ID號和組ID號(owner和group)可以通過getuid()和getgid()獲得。文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院umask----修改默認權(quán)限當(dāng)新建一個文件或目錄時,linux系統(tǒng)會根據(jù)(設(shè)定權(quán)限-umask值)來決定新建文件或目錄的權(quán)限;umask表示要關(guān)閉哪些權(quán)限,root的缺省umask是022,一般用戶是002;新建文件默認訪問權(quán)限是666,目錄權(quán)限是777。在創(chuàng)建文件或目錄時,系統(tǒng)把默認權(quán)限的值與umask的值相減,即得到新建文件的訪問權(quán)限。例如:系統(tǒng)為root用戶創(chuàng)建了一個新文件,那么新文件的權(quán)限644,而目錄則為755。如果用戶的umask為000,則創(chuàng)建的文件權(quán)限為666,目錄權(quán)限為777,

運行umask命令可以查看用戶自己的umask值。

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

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

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

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

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

total0

9797648-rw-r--r--

2

oracle

oinstall0Apr2108:11f1

9797648-rw-r--r--

2oracleoinstall0Apr2108:11f2

9797649lrwxrwxrwx

1oracleoinstall2Apr2108:11f3->f1

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

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

文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院其他文件管理系統(tǒng)調(diào)用例3:創(chuàng)建一個文件test.txt,然后通過4個不同的文件描述符寫這個文件。/*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*/

文件管理中國地質(zhì)大學(xué)(武漢)計算機學(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);}思考:程序運行的結(jié)果?文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院標(biāo)準I/O庫(stdio.h)

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

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

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

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

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

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

1.復(fù)制一個現(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).文件管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院fcntl系統(tǒng)調(diào)用fcntl()的返回值與命令有關(guān)。如果出錯,所有命令都返回-1,如果成功則返回某個其他值。下列命令有特定返回值:

F_DUPFD

返回新的文件描述符

F_GETFD

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

F_GETFL,F_GETOWN

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

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

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

·與原始操作符一樣的某對象的引用

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

·相同的訪問模式(讀,寫或讀/寫)

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

dup(oldfd);

等效于

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

F_GETFD

獲得與文件描述符fd關(guān)聯(lián)的close-on-exec標(biāo)志,類似FD_CLOEXEC。如果返回值和FD_CLOEXEC進行與運算結(jié)果是0的話,文件保持交叉式訪問exec(),否則如果通過exec運行的話,文件將被關(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)默認值,exec時不關(guān)閉)或1(exec時關(guān)閉)

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

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

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

O_NONBLOCK

非阻塞I/O

O_APPEND

強制每次寫(write)操作都添加在文件的末尾

O_DIRECT

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

O_ASYNC

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

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

返回和stream文件流對應(yīng)的文件描述符。如果失敗,返回-1例:menu1.c(LPP144)menu2.c程序中與用戶交互的部分不允許重定向,其他部分允許重定向。(LPP148)menu3.c將程序中與用戶交互的部分與stdin,stdout分開,直接讀寫終端。(LPP149)文件管理—設(shè)備管理中國地質(zhì)大學(xué)(武漢)計算機學(xué)院ttyname()----獲得當(dāng)前終端名稱#include<unistd.h>char*ttyname(intfd)調(diào)用成功返回打開的文件描述符fd對應(yīng)的終端名稱;調(diào)用失敗返回NULL;例:p6.1.c文件管理—設(shè)備管理中國地質(zhì)大學(xué)(武漢)計算機學(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用來指定什么時候新的終端屬性起作用;TCSANOW立即作用TCSADRAIN發(fā)送了所有輸出后才作用TCSAFLUSH發(fā)送了所有輸出后作用,且更改發(fā)生時未讀取的所有輸入數(shù)據(jù)都被清除(FLUSH)文件管理—設(shè)備管理中國地質(zhì)大學(xué)(武漢)計算機學(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)準模式)/密碼不顯示~ECHO

c_cc特殊的控制字符

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

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

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

OPOST

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

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

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

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

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

新行延時掩碼。取值為NL0和NL1。CRDLY回車延時掩碼。取值為CR0,CR1,CR2或CR3。TABDLY水平跳格延時掩碼。取值為TAB0,TAB1,TAB2,TAB3(或XTABS)。取值為TAB3,即XTABS,將擴展跳格為空格(每個跳格符填充8個空格)。BSDLY回車延時掩碼。取值為BS0或BS1.(從來沒有被實現(xiàn))VTDLY

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

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

GNBRK

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

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

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

去掉第八位。INLCR

將輸入的NL翻譯為CR。IGNCR

忽略輸入中的回車。ICRNL

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

CBAUD

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

字符長度掩碼。取值為CS5,CS6,CS7或CS8。CSTOPB

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

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

PARENB啟用奇偶校驗。PARODD輸入和輸出是奇校驗HUPCL

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

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

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

ICANON用于實現(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時,產(chǎn)生相應(yīng)的信號。ECHO

回顯輸入字符。ECHOE

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

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

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

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

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

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

c_cc[VTIME]

==0

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

==

0,

c_cc[VTIME]>0

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

==

0,

c_cc[VTIME]

==

0

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

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

#i

溫馨提示

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

評論

0/150

提交評論