




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
LINUX環(huán)境高級編程中國地質大學(武漢)計算機學院朱靜中國地質大學(武漢)計算機學院第四講系統(tǒng)調用線程進程管理文件管理錯誤處理系統(tǒng)調用概述系統(tǒng)調用概述系統(tǒng)調用概念為了利用文件操作、進程管理和設備管理這些操作系統(tǒng)提供的服務,應用程序必須和操作系統(tǒng)之間交互。這種交互通過“系統(tǒng)調用”來實現(xiàn)。系統(tǒng)調用是程序員和linux內核的函數(shù)接口。對程序員來說,系統(tǒng)調用就象庫函數(shù)(事實上有些就是庫函數(shù),由這些庫函數(shù)再進行真正的系統(tǒng)調用),只是前者直接在linux的核心執(zhí)行子程序調用。中國地質大學(武漢)計算機學院系統(tǒng)調用類別文件管理進程管理錯誤管理系統(tǒng)調用概述中國地質大學(武漢)計算機學院文件管理系統(tǒng)調用的層次結構文件特殊文件目錄文件openclosereadwritelseekunlinkchowndup2fcntlfstatftruncatestattruncatesyncduplink套接字Internet套接字mknodioctlpipegetdentsacceptbindconnectlistensocketgethostbynamegethostnamehtonlhtonsinet_addrinet_ntoa系統(tǒng)調用概述中國地質大學(武漢)計算機學院進程管理系統(tǒng)調用的層次結構進程信號nicechdirwaitforkexecexitalarmsingnalkillpause系統(tǒng)調用概述中國地質大學(武漢)計算機學院錯誤處理系統(tǒng)調用的層次結構錯誤處理perror#include<string.h>char*strerror(interrnum)返回錯誤原因的描述字符串系統(tǒng)調用概述中國地質大學(武漢)計算機學院錯誤處理錯誤處理perror()#include<errno.h>#include<stdio.h>系統(tǒng)調用失敗時返回-1,但這個返回值說明不了錯誤發(fā)生的原因,要查詢錯誤原因,必須了解:errno保存上次系統(tǒng)調用錯誤的數(shù)字碼的全局變量,初值為0從程序訪問errno,預定義的錯誤碼在C程序中通過包含文件“/usr/include/errno.h”來定義。perror程序把errno的當前值轉換為文本描述中國地質大學(武漢)計算機學院例:/usr/include/…/errno.h所包含的部分錯誤常量:#defineEPERM1/*Operationnotpermitted*/#defineENOENT2/*Nosuchfileordirectory*/#defineESRCH3/*Nosuchprocess*/#defineEINTR4/*Interruptedsystemcall*/錯誤處理中國地質大學(武漢)計算機學院例:perror()應用//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”);}錯誤處理中國地質大學(武漢)計算機學院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”);}錯誤處理中國地質大學(武漢)計算機學院例:perror()應用執(zhí)行:$./showErrnoerrno=2main:Nosuchfileordirectoryerrno=21main:Isadirectoryerrno=29…evenafterasuccessfulcallmain:Illegalseekmain:Success…afterweresetmanually$_
錯誤處理中國地質大學(武漢)計算機學院文件管理文件管理基礎文件管理系統(tǒng)調用能夠操作所有的普通文件、特殊文件和目錄文件,包括:基于磁盤的文件終端打印機等設備進程間通信功能,如管道和套接字多數(shù)情況下,最初使用open()訪問或創(chuàng)建文件,如果系統(tǒng)調用成功,則返回一個稱為“文件描述符”的小整數(shù),用于對該文件的I/O操作。如果open()失敗,返回-1。中國地質大學(武漢)計算機學院Linux的文件系統(tǒng)實現(xiàn)Linux系統(tǒng)中,實現(xiàn)文件存儲和索引的核心是索引節(jié)點(inode)結構。每個inode存儲了文件的屬性、訪問權限以及文件數(shù)據(jù)塊的位置。inode是linux系統(tǒng)定位文件的基本途徑。VFS(虛擬文件系統(tǒng)):VFS屏蔽了各種具體的文件分區(qū)格式,使得用戶程序對文件系統(tǒng)的操作不必關心底層的存儲介質和文件系統(tǒng)類型的不同。文件管理中國地質大學(武漢)計算機學院文件描述符文件描述符從0開始按順序編號,前三個描述符具有特定含義:0標準輸入(stdin)---鍵盤1標準輸出(stdout)---顯示器2標準錯誤(stderr)單個文件能打開幾次,因此它可以有多個文件描述符文件fd1fd2fd3文件管理中國地質大學(武漢)計算機學院文件描述符每個文件描述符有其專有的屬性集,與它所關聯(lián)的文件無關。這些屬性包括:記錄文件中進行讀寫操作的偏移量的文件指針;指示如果進程調用exec(),文件描述符是否應自動關閉的標志;指示對文件的所有輸出是否應追加到文件末尾的標志;文件管理中國地質大學(武漢)計算機學院文件描述符以下屬性只在文件是管道和套接字這樣的特殊文件時才有意義:指示如果文件當前不包含任何輸入,進程是否應阻塞來自該文件的輸入的標志;指示如果文件輸入變?yōu)榭捎?,應發(fā)送一個SIGIO信號的進程ID或進程組的數(shù)字;open(),read(),fcntl()等系統(tǒng)調用能操作這些標志。文件管理中國地質大學(武漢)計算機學院文件管理—目錄目錄操作getcwd—獲得當前工作目錄#include<unistd.h>char*getcwd(char*buffer,size_tsize)調用成功把當前目錄字符串寫到緩沖區(qū)buffer中,并返回指向當前工作目錄字符串的指針,如果目錄字符串長度超出了參數(shù)size給出的緩沖區(qū)長度,目錄被刪除或者權限發(fā)生變化,則調用失敗返回NULL。中國地質大學(武漢)計算機學院#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");}文件管理—目錄中國地質大學(武漢)計算機學院運行結果:CurrentMaxPathLengthis:4096CurrentWorkingDirectoryis:/root文件管理—目錄中國地質大學(武漢)計算機學院pathconf—獲得系統(tǒng)目錄最大長度#include<unistd.h>longpathconf(char*path,intname)調用成功返回目錄相關的極限值調用失敗返回-1path可以是包含文件名的路徑,也可以是目錄路徑name的取值可以是:_PC_LINK_MAX_PC_NAME_MAX_PC_PATH_MAX……文件管理—目錄中國地質大學(武漢)計算機學院例:#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;文件管理—目錄中國地質大學(武漢)計算機學院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;}運行結果:currentpathlengthis:4096Currentworkingdirectoryis:/root文件管理—目錄中國地質大學(武漢)計算機學院chdir,fchdir—切換當前目錄#include<unistd.h>intchdir(constchar*path)intfchdir(intfd)調用成功返回0,失敗返回-1path指向目錄字符串的指針fd目錄的文件描述符文件管理—目錄中國地質大學(武漢)計算機學院mkdir,rmdir---創(chuàng)建、刪除目錄#include<sys/stat.h>#include<sys/types.h>intmkdir(constchar*pathname,mode_tmode)pathname:要創(chuàng)建的目錄名mode:指定要創(chuàng)建目錄的權限#include<unistd.h>intrmdir(constchar*pathname)pathname:要刪除的目錄名文件管理—目錄中國地質大學(武漢)計算機學院opendir---打開目錄#include<sys/types.h>#include<dirent.h>DIR*opendir(constchar*pathname);
調用成功打開pathname指定的目錄并建立一個目錄流,返回指向結構體DIR的指針。調用失敗返回NULL。readdir---獲得打開目錄下的具體內容structdirent*readdir(DIR*dir);調用成功返回指向結構體dirent的指針,返回參數(shù)dir目錄流的下個目錄進入點。后續(xù)的readdir將返回后續(xù)的目錄項。調用失敗或讀取到目錄尾則返回NULL。文件管理—目錄中國地質大學(武漢)計算機學院structdirent{ino_td_ino; off_td_off; unsignedshortd_reclen; unsignedchard_type; chard_name[NAME_MAX+1];}d_ino:當前目錄的inode節(jié)點號;d_off:目錄文件首部到下個dirent結構的位移;d_reclen:該記錄的長度;d_type:目錄文件類型;d_name:目錄文件名;例:獲取指定目錄下的所有文件名和目錄名。p4.9.c,printdir.c,printdir2.c文件管理—目錄中國地質大學(武漢)計算機學院#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;}文件管理—目錄中國地質大學(武漢)計算機學院文件管理文件基本操作通過文件描述符對文件進行操作。例:p4.5.c注意:程序運行時,子進程與父進程之間文件描述符的繼承方式中國地質大學(武漢)計算機學院典型的文件操作事件序列intfd;//filedescriptor…fd=open(fileName,…);/*openfile,returnfiledescriptor*/If(fd=-1){/*dealwitherrorcondition*/}…fcntl(fd,…);/*setsomeI/Oflagsifnecessary*/…read(fd,…);/*readfromfile*/…文件管理中國地質大學(武漢)計算機學院典型的文件操作事件序列write(fd,…);//writetofile…lseek(fd,…);//seekwithinfile…close(fd);//closethefile,freeingfiledescriptor文件管理中國地質大學(武漢)計算機學院open()----打開文件
#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>intopen(char*fileName,intmode[,intpermissions])open只能以只讀或讀寫方式打開或創(chuàng)建文件fileName:一個絕對/相對路徑的文件名;mode:打開模式;permissions:文件權限的八進制值,只在文件創(chuàng)建時需要;文件管理中國地質大學(武漢)計算機學院open()----打開文件permissions可以是幾個標志位按位或后得到。這些標志在sys/stat.h中定義。S_IRUSR文件所有者讀權限S_IWUSR文件所有者寫權限S_IXUSR文件所有者執(zhí)行權限S_IRGRP文件所屬組讀權限S_IWGRP文件所屬組寫權限S_IXGRP文件所屬組執(zhí)行權限
S_IROTH其他用戶讀權限S_IWOTH其他用戶寫權限S_IXOTH其他用戶執(zhí)行權限例:open(“myfile”,O_CREAT,S_IRUSR|S_IXOTH)文件管理中國地質大學(武漢)計算機學院預定義的讀/寫標志和混合標志的值在”/usr/include/fcntl.h”中定義:O_RDONLY以只讀方式打開O_WRONLY以只寫方式打開O_RDWR以讀寫方式打開O_APPEND以追加方式打開(新寫入的數(shù)據(jù)放在文件末尾)O_TRUNC打開文件時將文件長度設置為0,丟棄文件已有的內容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才有效,文件實際權限為mode&(~umask)打開已經(jīng)存在的文件fd=open(fileName,O_RDONLY);文件管理中國地質大學(武漢)計算機學院read()----讀文件#include<unistd.h>ssize_tread(intfd,void*buf,size_tcount)read()從文件描述符fd引用的文件讀取count個字節(jié)到緩沖區(qū)buf中。調用成功,read()返回它讀取的字節(jié)數(shù),否則返回-1;如果在已經(jīng)讀取了最后一個字節(jié)后調用read(),它返回0,表示到達了文件末尾。例:
charsRead=read(fd,buffer,BUFFER_SIZE);if(charRead==0)break;//endoffileIf(charRead==-1)fatalError();//error文件管理中國地質大學(武漢)計算機學院write()----寫文件#include<unistd.h>ssize_twrite(intfd,void*buf,size_tcount)write()從緩沖區(qū)buf向文件描述符fd引用的文件復制count個字節(jié)的數(shù)據(jù)。數(shù)據(jù)從當前文件位置開始寫入。如果打開文件時設置為O_APPEND模式,則每次寫入時當前文件位置被置為文件末尾,即以追加方式向文件寫入數(shù)據(jù)。調用成功,write()返回它復制的字節(jié)數(shù),否則返回-1;進程應該總是檢查返回值,如果返回值不是count,可能磁盤已寫滿。文件管理中國地質大學(武漢)計算機學院寫文件write()例:
/*Copylinetotemporaryfileifreadingfromstdin*/if(standardInput){charsWritten=write(tmpfd,buffer,charsRead);if(charsWritten!=charsRead) fatalError();}文件管理中國地質大學(武漢)計算機學院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相對于當前文件位置SEEK_ENDoffset相對于文件末尾如果試圖移動文件指針到文件頭之前,lseek()會失敗。調用成功,lseek()返回相對文件頭的當前字節(jié)偏移量,調用失敗返回-1文件管理中國地質大學(武漢)計算機學院文件指針移動到文件末尾之外會如何?
off_t
currpos;
currpos=lseek(fd,0,SEEK_CUR);#返回當前文件指針偏移量;
如果fd指向的是pipe、FIFO或者socket,lseek返回-1并且置errno為
ESPIPE。中國地質大學(武漢)計算機學院文件管理移動文件指針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ù)文件管理中國地質大學(武漢)計算機學院close()----關閉文件#include<unistd.h>intclose(intfd)調用成功,close()返回0,否則返回-1。如果fd是打開文件關聯(lián)的最后一個文件描述符,給該文件分配的內核資源將被收回。當一個進程結束時,它所有的文件描述符都會自動關閉,但提倡當完成文件操作時關閉文件。如果關閉一個已經(jīng)關閉的文件,會發(fā)生錯誤。當文件關閉時,不保證文件緩沖區(qū)立即清空到磁盤。例:close(fd);/*Closeinputfile*/文件管理中國地質大學(武漢)計算機學院刪除文件unlink()函數(shù)定義:intunlink(constchar*fileName)unlink()刪除從文件名finleName指向文件的鏈接。如果fileName是指向文件的最后一個硬鏈接,文件的資源被收回。如果調用成功,unlink()返回0,否則返回-1。例:
/*Removetempfile*/if(standardInput)unlink(tmpName);文件管理中國地質大學(武漢)計算機學院文件管理實例—reverse.c例:reverse-c[fileName]reverse將輸入文件的各行逆序顯示在標準輸出上。如果不指定文件名,則逆序顯示標準輸入的內容。當使用-c選項時,reverse還顛倒每一行中的字符。$gccreverse.c-oreverse$cattestChirstmasiscoming,Thedaysthatgrowshorter.$./reverse–ctest.retrohsworgthatsyadehT,gnimocsisamtsrihC文件管理中國地質大學(武漢)計算機學院reverse的工作過程步驟操作函數(shù)系統(tǒng)調用分析命令行parseCommmandLine,openprocessOptions
打開輸入文件或讀取標準輸入,創(chuàng)pass1open
建存儲輸入的臨時文件讀取文件,把各行的起始pass1,trackLinesread
偏移量保存在數(shù)組中反向讀取文件,把每行復制pass2,processLine,lseek
到標準輸出,如果選擇-c,reverseLine
字符也會逆序輸出。關閉文件,如果是臨時文件,pass2close
刪除臨時文件文件管理中國地質大學(武漢)計算機學院其他文件管理系統(tǒng)調用名稱功能opendir()打開目錄readdir()讀目錄closedir()關閉目錄chown()改變文件所有者和文件組chmod()改變文件權限dup()復制文件描述符dup2同dupfcntl()對各種文件特性的訪問stat()獲取文件信息文件管理中國地質大學(武漢)計算機學院其他文件管理系統(tǒng)調用名稱功能sync調度所有文件緩沖區(qū)清空到磁盤mknod創(chuàng)建特殊文件link創(chuàng)建硬鏈接symlink創(chuàng)建符號鏈接ioctl控制設備truncate截短文件ftruncate同truncate文件管理中國地質大學(武漢)計算機學院其他文件管理系統(tǒng)調用intchown(constchar*path,uid_towner,gid_tgroup);用戶ID和組ID(owner和group)可以通過getuid()和getgid()獲得,如果參數(shù)owner或group為-1,表示對應的所有者或組不會改變。例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文件管理中國地質大學(武漢)計算機學院其他文件管理系統(tǒng)調用intchmod(constchar*path,mode_tmode);
例2:把文件test.txt的權限標志改為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文件管理中國地質大學(武漢)計算機學院獲得文件信息stat()#include<sys/types.h>#include<sys/stat.h>#include<unistd.h>intfstat(intfd,
structstat*statbuf)返回與打開的文件描述符相關的文件的狀態(tài)信息,該信息寫到structstat結構中intstat(constchar*pathname,structstat*statbuf)intlstat(constchar*pathname,structstat*statbuf)stat和lstat是通過文件名查到文件狀態(tài)信息,它們產(chǎn)生的結果相同。但當文件是一個符號鏈接時,lstat返回的是該符號鏈接本身的信息,而stat返回的是該鏈接所指向的文件的信息。調用成功返回0,失敗返回-1文件管理中國地質大學(武漢)計算機學院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;}文件管理中國地質大學(武漢)計算機學院st_dev:文件所處的磁盤設備ID號;st_ino:文件的inode索引號;st_mode:文件訪問權限和文件類型;st_nlink:文件的硬鏈接數(shù);st_uid:文件所屬的用戶ID;st_gid:文件所屬的組ID;st_rdev:如果文件是字符或塊設備,該值給出該設備的標識符信息;st_size:對常規(guī)文件,該值為文件大小;對符號鏈接,該值為該符號鏈接所指向的目錄長度;對設備文件,該值為0;st_blksize:文件系統(tǒng)存儲文件的塊大小;st_blocks:分配給文件的塊數(shù);st_atime:文件的最近訪問時間;st_mtime:文件內容的最近修改時間;st_ctime:文件屬性的最近修改時間;文件管理中國地質大學(武漢)計算機學院st_mode:文件訪問權限和文件類型;sys/stat.h中提供了POSIX標準的一些宏用于對文件類型、文件訪問權限以及用于幫助測試特定類型和權限的掩碼的定義。文件訪問權限標志同open系統(tǒng)調用。用于判定文件類型的宏:
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í)行權限;S_IRWXG:文件所屬組用戶的的讀/寫/執(zhí)行權限;S_IRWXO:其他用戶的的讀/寫/執(zhí)行權限;
文件管理中國地質大學(武漢)計算機學院
例:測試一個文件不是目錄,并設置了owneruser的執(zhí)行權限stat(“filename”,&statbuf);mode=statbuf.st_mode;if(!S_ISDIR(mode)&&(mode&S_IRWXU)==S_IXUSR)文件管理中國地質大學(武漢)計算機學院文件類型標志:
S_IFBLK文件是一個塊設備
S_IFDIR文件是一個目錄
S_IFCHR文件是一個字符設備
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);文件管理中國地質大學(武漢)計算機學院文件訪問權限的獲?。簆rintf("Permission:%o\n",mode&0x1ff);mode是一個無符號整型,一共有16位,前面7位用來表示文件類型,可用掩碼按位與確定,后面9位為權限,分別是用戶權限,組權限,其他權限,把后9位用0x1ff(111111111)做位運算&就能獲得文件權限值。
文件管理中國地質大學(武漢)計算機學院例:stat系統(tǒng)調用的應用。
statapply.c文件管理中國地質大學(武漢)計算機學院chmod,fchmod----修改文件權限#include<sys/types.h>#include<sys/stat.h>intchmod(constchar*path,mode_tmode);path文件或目錄所在的路徑;調用成功返回0,調用失敗返回-1;intfchmod(intfd,mode_tmode);文件管理中國地質大學(武漢)計算機學院chmod,fchmod中使用的宏S_ISUID設置用戶權限S_ISGID設置組用戶權限S_IRUSR文件所有者的讀權限S_IWUSR文件所有者的寫權限S_IXUSR文件所有者的執(zhí)行權限……
文件訪問權限標志與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
文件管理中國地質大學(武漢)計算機學院chown,fchown,lchown---改變文件所有者#include<sys/types.h>#include<unistd.h>intchown(constchar*path,uid_towner,gid_tgroup);path文件或目錄的路徑;調用成功返回0,調用失敗返回-1;只有超級用戶才能調用該函數(shù)。用戶ID號和組ID號(owner和group)可以通過getuid()和getgid()獲得。文件管理中國地質大學(武漢)計算機學院umask----修改默認權限當新建一個文件或目錄時,linux系統(tǒng)會根據(jù)(設定權限-umask值)來決定新建文件或目錄的權限;umask表示要關閉哪些權限,root的缺省umask是022,一般用戶是002;新建文件默認訪問權限是666,目錄權限是777。在創(chuàng)建文件或目錄時,系統(tǒng)把默認權限的值與umask的值相減,即得到新建文件的訪問權限。例如:系統(tǒng)為root用戶創(chuàng)建了一個新文件,那么新文件的權限644,而目錄則為755。如果用戶的umask為000,則創(chuàng)建的文件權限為666,目錄權限為777,
運行umask命令可以查看用戶自己的umask值。
文件管理中國地質大學(武漢)計算機學院umask----修改默認權限umask函數(shù)可以修改umask值;#include<sys/types.h>#include<sys/stat.h>mode_tumask(mode_tmask);例:p4.8.c文件管理中國地質大學(武漢)計算機學院硬鏈接和軟鏈接(符號鏈接)1)硬鏈接:指向inode節(jié)點的鏈接;ln命令可以創(chuàng)建硬鏈接;$lnlink.testnewlink12)軟鏈接(符號鏈接):指向文件名的鏈接;$ln–slink.symbolnewlink23)只有文件才能創(chuàng)建硬鏈接,目錄不能創(chuàng)建硬鏈接;硬鏈接不能跨文件系統(tǒng);4)只有文件所有的硬鏈接被刪除,該文件才能真正被刪除;5)符號鏈接可以跨文件系統(tǒng);符號鏈接不影響文件的刪除;文件管理中國地質大學(武漢)計算機學院硬鏈接和軟鏈接(符號鏈接) $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
從上面的結果中可以看出,硬鏈接文件f2與原文件f1的inode節(jié)點相同,均為9797648,然而符號鏈接文件的inode節(jié)點不同。中國地質大學(武漢)計算機學院文件管理link---創(chuàng)建硬鏈接#include<unistd.h>intlink(constchar*oldpath,constchar*newpath);調用成功返回0,調用失敗返回-1;symlink---創(chuàng)建符號鏈接#include<unistd.h>intsymlink(constchar*oldpath,constchar*newpath);unlink---刪除鏈接#include<unistd.h>intunlink(constchar*path);文件管理中國地質大學(武漢)計算機學院綜合實例:定制自己的ls命令。
p4.10.c打開目錄獲得該目錄下的所有文件列表將文件列表存入一個鏈表中遍歷鏈表,對每個文件調用stat輸出每個文件信息打開目錄信息輸出文件管理中國地質大學(武漢)計算機學院其他文件管理系統(tǒng)調用#include<unistd.h>intdup(intfd);intdup2(intoldfd,intnewfd);dup()和dup2()函數(shù)用于復制打開的文件描述符。dup()返回當前進程最小的未使用的文件描述符。dup2()函數(shù)中指定的newfd如果已經(jīng)使用,將先被關閉,再進行復制。
文件管理中國地質大學(武漢)計算機學院其他文件管理系統(tǒng)調用例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*/
文件管理中國地質大學(武漢)計算機學院其他文件管理系統(tǒng)調用例3:續(xù)fd3=dup(fd1);/*Makeanothercopyoffd1*/printf("fd3=%d\n",fd3);
write(0,"doc",4);
dup2(3,2);/*Duplicatechannel3tochannel2*/
write(2,"?\n",2);}思考:程序運行的結果?文件管理中國地質大學(武漢)計算機學院標準I/O庫(stdio.h)
標準I/O庫提供復雜函數(shù)用于格式化I/O和滿足設備的緩沖需求,用于為底層I/O系統(tǒng)調用提供一個通用接口。
標準I/O庫中,與底層文件描述符對應的是流(stream),它被實現(xiàn)為指向結構FILE的指針。
每個文件流都跟一個底層文件描述符關聯(lián)。
進程創(chuàng)建時,有3個文件流自動打開:stdin、stdout、stderr。它們與底層文件描述符0,1,2對應,在stdio.h中被定義。文件管理中國地質大學(武漢)計算機學院標準I/O庫函數(shù)fopen、fclosefread、fwritefgetc、getc、getcharfputc、putc、putcharfgets、getsprintf、fprintf、sprintfscanf、fscanf、sscanf文件管理中國地質大學(武漢)計算機學院標準I/O庫函數(shù)與系統(tǒng)調用運行效率的對比
copy_system.c系統(tǒng)調用,每次讀一個字符(LPP87) copy_block.c系統(tǒng)調用,每次讀一個block(LPP88) copy_stdio.c庫函數(shù)調用,F(xiàn)ILE內部緩沖區(qū)滿時才進行底層系統(tǒng)調用(LPP98)$TIMEFORMAT=……$time./copy_***對比運行時間文件管理中國地質大學(武漢)計算機學院/proc文件系統(tǒng) /proc是一個特殊的目錄,它映射到linux提供的一個特殊的文件系統(tǒng)procfs,用來實現(xiàn)對底層的設備驅動程序和內核信息進行更高層次的訪問。文件管理中國地質大學(武漢)計算機學院/proc文件系統(tǒng)的內容
/proc下以數(shù)字命名的子目錄用于提供進程的信息; /proc/modules所有加載到內核的模塊列表 /proc/mounts系統(tǒng)中使用的所有掛載 /proc/partitions分區(qū)中的塊分配信息 /proc/stat所有的CPU活動信息 /proc/versionLinux內核版本和gcc版本 /proc/fs文件系統(tǒng)信息 /proc/cpuinfocpu的詳細信息 /proc/net網(wǎng)卡設備信息 /proc/ttytty設備信息直接讀取這些文件內容就能獲得狀態(tài)信息(例如cat顯示)超級用戶可以通過寫/proc下的文件來修改系統(tǒng)參數(shù)文件管理中國地質大學(武漢)計算機學院fcntl系統(tǒng)調用對打開的文件描述符執(zhí)行各種操作,包括對它們的復制、獲取和設置文件描述符標志、獲取和設置文件狀態(tài)標志,以及管理建議性文件鎖等。#include<fcntl.h>intfcntl(intfd,intcmd);intfcntl(intfd,intcmd,longarg);intfcntl(intfd,intcmd,structflock*lock);對不同操作的選擇是通過選取命令參數(shù)cmd不同的值來實現(xiàn)的,其取值定義在fcntl.h中。根據(jù)所選擇的命令的不同,決定是否需要第三個參數(shù)。文件管理中國地質大學(武漢)計算機學院fcntl系統(tǒng)調用fcntl系統(tǒng)調用有5種功能:
1.復制一個現(xiàn)有的描述符(cmd=F_DUPFD).
2.獲得/設置文件描述符標記(cmd=F_GETFD或F_SETFD).
3.獲得/設置文件狀態(tài)標記(cmd=F_GETFL或F_SETFL).
4.獲得/設置異步I/O所有權(cmd=F_GETOWN或F_SETOWN).
5.獲得/設置記錄鎖(cmd=F_GETLK,F_SETLK或F_SETLKW).文件管理中國地質大學(武漢)計算機學院fcntl系統(tǒng)調用fcntl()的返回值與命令有關。如果出錯,所有命令都返回-1,如果成功則返回某個其他值。下列命令有特定返回值:
F_DUPFD
返回新的文件描述符
F_GETFD
返回相應標志
F_GETFL,F_GETOWN
返回一個正的進程ID或負的進程組ID文件管理中國地質大學(武漢)計算機學院cmd=F_DUPFD
返回一個如下描述的(文件)描述符:
·最小的大于或等于arg的一個可用的描述符
·與原始操作符一樣的某對象的引用
·如果對象是文件(file)的話,則返回一個新的描述符,這個描述符與arg共享相同的偏移量(offset)
·相同的訪問模式(讀,寫或讀/寫)
·相同的文件狀態(tài)標志 ·新文件描述符的close-on-exec標志被設置為交叉式訪問
dup(oldfd);
等效于
fcntl(oldfd,F_DUPFD,0);文件管理中國地質大學(武漢)計算機學院cmd=F_GETFD和F_SETFD
F_GETFD
獲得與文件描述符fd關聯(lián)的close-on-exec標志,類似FD_CLOEXEC。如果返回值和FD_CLOEXEC進行與運算結果是0的話,文件保持交叉式訪問exec(),否則如果通過exec運行的話,文件將被關閉(arg被忽略)
F_SETFD
設置close-on-exec標志,該標志以參數(shù)arg的FD_CLOEXEC位決定,通常不使用常數(shù)FD_CLOEXEC,而是將此標志設置為0(系統(tǒng)默認值,exec時不關閉)或1(exec時關閉)
文件管理中國地質大學(武漢)計算機學院cmd=F_GETFL和F_SETFLF_GETFL
取得fd的文件狀態(tài)標志,(O_RDONLY,O_WRONLY,O_RDWR)需要用屏蔽字O_ACCMODE相與取得存取方式位,然后將結果與三個常量比較進行判定。F_SETFL
設置描述符狀態(tài)標志
O_NONBLOCK
非阻塞I/O
O_APPEND
強制每次寫(write)操作都添加在文件的末尾
O_DIRECT
最小化或去掉reading和writing的緩存影響
O_ASYNC
當I/O可用的時候,允許SIGIO信號發(fā)送到進程組,例如:當有數(shù)據(jù)可以讀的時候例:獲取文件描述符屬性。getfdinfo.c文件管理中國地質大學(武漢)計算機學院設備文件概述linux系統(tǒng)中,所有的設備都以特殊文件的形式存在。在/dev目錄下保存了指向系統(tǒng)中硬件的特殊文件。程序可以像訪問普通文件一樣來訪問硬件,無需使用特殊的接口函數(shù)。設備類型:字符設備以字節(jié)流訪問的設備塊設備以塊為單位進行讀寫操作的設備網(wǎng)絡接口主設備號和從設備號:內核通過主從設備號將設備文件與真實的設備關聯(lián)起來。由同一個設備驅動控制的所有設備具有相同的主設備號;從設備號用以區(qū)分相同的設備驅動控制的不同子設備。文件管理—設備管理中國地質大學(武漢)計算機學院重要的設備文件/dev/console系統(tǒng)控制臺。錯誤信息和診斷信息被發(fā)送到這里。/dev/tty控制終端的別名(邏輯設備)。/dev/null空設備。所有寫往這個設備的輸出都被丟棄,讀這個設備會立即返回一個EOF標志。文件管理—設備管理中國地質大學(武漢)計算機學院linux設備驅動工作流程Linux系統(tǒng)啟動時,設備驅動將被加載;設備驅動加載成功后,向系統(tǒng)反饋一個主設備號,驅動程序將根據(jù)該主設備號在/dev目錄下創(chuàng)建對應的設備文件。之后,用戶程序就可以利用open(),read(),write()等函數(shù)或命令,通過設備文件實現(xiàn)對設備的訪問。文件管理—設備管理中國地質大學(武漢)計算機學院Linux終端設備用戶與主機交互的設備稱為終端設備。Linux系統(tǒng)中所有終端設備被稱為tty。是字符設備。Linux中的終端設備文件類型:串行端口終端(/dev/ttySn):分別對應于COM1,COM2,……,COMn口;偽終端(/dev/pts/n):使用telet登錄到linux系統(tǒng)控制終端(dev/tty):當前進程的控制終端控制臺終端(dev/tty,/dev/console):linux將顯示器稱為控制臺終端,用于接收和輸出控制臺信息。默認有tty1~tty6,tty7~tty8。文件管理—設備管理中國地質大學(武漢)計算機學院與終端的交互#include<unistd.h>intisatty(intfd);
若fd為終端設備則返回1,否則返回0intfileno(FILE*stream);
返回和stream文件流對應的文件描述符。如果失敗,返回-1例:menu1.c(LPP144)menu2.c程序中與用戶交互的部分不允許重定向,其他部分允許重定向。(LPP148)menu3.c將程序中與用戶交互的部分與stdin,stdout分開,直接讀寫終端。(LPP149)文件管理—設備管理中國地質大學(武漢)計算機學院ttyname()----獲得當前終端名稱#include<unistd.h>char*ttyname(intfd)調用成功返回打開的文件描述符fd對應的終端名稱;調用失敗返回NULL;例:p6.1.c文件管理—設備管理中國地質大學(武漢)計算機學院tcgetattr()----獲得終端相關參數(shù)tcsetattr()----設置終端相關參數(shù)#include<unistd.h>#include<termios.h>inttcgetattr(intfd,structtermios*termios_p);inttcsetattr(intfd,intoptional_actions,consttermios*termios_p);調用成功返回0;調用失敗返回-1;optional_actions用來指定什么時候新的終端屬性起作用;TCSANOW立即作用TCSADRAIN發(fā)送了所有輸出后才作用TCSAFLUSH發(fā)送了所有輸出后作用,且更改發(fā)生時未讀取的所有輸入數(shù)據(jù)都被清除(FLUSH)文件管理—設備管理中國地質大學(武漢)計算機學院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本地模式:可以設置(非/標準模式)/密碼不顯示~ECHO
c_cc特殊的控制字符
通過termios結構可以對終端接口進行控制
輸入模式,輸出模式,控制模式,本地模式,特殊控制字符
文件管理—設備管理中國地質大學(武漢)計算機學院c_oflag
OPOST
啟用具體實現(xiàn)自行定義的輸出。OLCUC
(不屬于POSIX)將輸出中的小寫字母映射為大寫字母。ONLCR(XSI)將輸出中的新行符映射為回車-換行OCRNL
將輸出中的回車映射為新行符。ONOCR不在第0列輸出回車。ONLRET不輸出回車。OFILL
發(fā)送填充字符作為延時。OFDEL
(不屬于POSIX)填充字符是ASCIIDEL(0177)。如果不設置填充字符則是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。文件管理—設備管理中國地質大學(武漢)計算機學院c_iflag
GNBRK
忽略輸入中的BREAK狀態(tài)BRKINT
如果設置了IGNBRK,將忽略BREAK。如果沒有設置,但是設置了BRKINT,那么BREAK將使得輸入和輸出隊列被刷新,如果終端是一個前臺進程組的控制終端,這個進程組中所有進程將收到SIGINT信號。如果既未設置IGNBRK也未設置BRKINT,BREAK將視為NUL同義字符,除非設置了PARMRK,這種情況下被視為序列\(zhòng)377\0\0IGNPAR
忽略幀錯誤和奇偶校驗錯誤PARMRK如果沒有設置IGNPAR,在有奇偶校驗錯誤或者楨錯誤的字符前插入\377\0。如果既沒有設置IGNPAR也沒有設置PARMRK,將所有奇偶校驗錯誤或者幀錯誤的字符視為\0。INPCK啟用輸入奇偶校驗檢測。ISTRIP
去掉第八位。INLCR
將輸入的NL翻譯為CR。IGNCR
忽略輸入中的回車。ICRNL
將輸入中的回車翻譯為新行字符(除非設置了IGNCR)。文件管理—設備管理中國地質大學(武漢)計算機學院c_cflag
CBAUD
(不屬于POSIX)波特率掩碼(4+1位)。CBAUDEX(不屬于POSIX)擴展的波特率掩碼(1位),包含在CBAUD中。CSIZE
字符長度掩碼。取值為CS5,CS6,CS7或CS8。CSTOPB
設置兩個停止位。(默認為1個)
CREAD啟用接收,可以接收字符。
PARENB啟用奇偶校驗。PARODD輸入和輸出是奇校驗HUPCL
在最后一個進程關閉設備后,降低MODEM控制線(掛斷)。CLOCAL
忽略MODEM控制線。LOBLK(不屬于POSIX)從非當前SHELL層阻塞輸出(用于sh1)。CIBAUD(不屬于POSIX)輸入速度的掩碼。CIBAUD各位的值與CBAUD各位相同,左移了IBSHIFT位。CRTSCTS
(不屬于POSIX)啟用RTS/CTS(硬件)控制流。文件管理—設備管理中國地質大學(武漢)計算機學院c_lflag
ICANON用于實現(xiàn)規(guī)范輸入,即read()讀到行結束符后返回,常用于終端的處理;若串口用于發(fā)送/接收數(shù)據(jù),則應清除此標志,使用非規(guī)范模式(raw
mode)。非規(guī)范模式中,輸入數(shù)據(jù)不組成行,不處規(guī)范模式中的特殊字符。ISIG當接收到字符INTR,QUIT,SUSP或DSUSP時,產(chǎn)生相應的信號。ECHO
回顯輸入字符。ECHOE
如果同時設置了ICANON,字符ERASE擦除前一個輸入字符,WERASE擦除前一個詞。ECHOK如果同時設置了ICANON,字符KILL刪除當前行。ECHONL
如果同時設置了ICANON,回顯字符NL,即使沒有設置ECHO。NOFLSH禁止產(chǎn)生SIGINT,SIGQUIT和SIGSUSP信號時刷新輸入和輸出隊列。TOSTOP
向試圖寫控制終端的后臺進程組發(fā)送SIGTTOU信號。PENDIN(不屬于POSIX;LINUX不支持)在讀入一個字符時,輸入隊列中的所有字符被重新輸出。(bash用他來處理typeahead)。IEXTEN啟用實現(xiàn)自定義的輸入處理。這個標志必須與ICANON同時使用,才能解釋特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC標志才有效。文件管理—設備管理中國地質大學(武漢)計算機學院c_cc數(shù)組
在非規(guī)范模式中,c_cc[VMIN]和c_cc[VTIME]用于設置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;
文件管理—設備管理中國地質大學(武漢)計算機學院例:密碼輸入關閉回顯
#i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 有效排痰護理 2
- 造口并發(fā)癥及處理
- 心肺復蘇知識培訓
- 浙江省2023~2024學年高二數(shù)學下學期返校聯(lián)考試題含答案
- 貴州省黔西南州金成實驗學校2024?2025學年高一下學期3月檢測 數(shù)學試卷(含解析)
- 江蘇省鹽城市大豐區(qū)新豐初級中學2025屆學業(yè)水平模擬考試化學試題仿真模擬試題A卷含解析
- 內蒙古豐州職業(yè)學院《食品工藝綜合實驗》2023-2024學年第一學期期末試卷
- 九州職業(yè)技術學院《礦床地球化學》2023-2024學年第二學期期末試卷
- 四川省成都實驗高級中學2025屆高三年級5月統(tǒng)測模擬試卷含解析
- 西交利物浦大學《理論力學B》2023-2024學年第二學期期末試卷
- 甲油膠行業(yè)報告
- 露天礦排土場初步設計
- DB51T 692-2018 中小學實驗室設備技術規(guī)范
- 山東省萊西市2024-2025學年高一語文下學期3月月考試題含解析
- 中醫(yī)院手術麻醉科介紹
- 給甲方發(fā)工程報告范文
- 2024年下半年山東濰坊市再擔保集團股份限公司社會招聘11人易考易錯模擬試題(共500題)試卷后附參考答案
- 2021年4月17日江蘇事業(yè)單位考試《綜合知識和能力素質》(管理崗客觀題)
- 計算與人工智能概論(湖南大學)知到智慧樹章節(jié)答案
- 小學科學教師資格考試面試試題及答案指導(2025年)
- 五年(2020-2024)高考語文真題分類匯編專題05 名著閱讀(解析版)
評論
0/150
提交評論