




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
5.1文件I/O介紹可用的文件I/O函數(shù)——打開文件、讀文件、寫文件等等。大多數(shù)linux文件I/O只需用到5個函數(shù):open、read、write、lseek
以及close。 不帶緩存指的是每個read和write都調(diào)用內(nèi)核中的一個系統(tǒng)調(diào)用。這些不帶緩存的I/O函數(shù)不是ANSIC的組成部分,但是POSIX組成部分。5.2文件描述符對于內(nèi)核而言,所有打開文件都由文件描述符引用。當(dāng)打開一個現(xiàn)存文件或創(chuàng)建一個新文件時,內(nèi)核向進程返回一個文件描述符。當(dāng)讀、寫一個文件時,用open或creat返回的文件描述符標識該文件,將其作為參數(shù)傳送給read或write。文件描述符是一個非負整數(shù)。文件描述符的范圍是0~OPEN_MAX。其中0、1、2分別被代換為符號常量,系統(tǒng)留用:STDIN_FILENO0標準輸入(默認為鍵盤)STDOUT_FILENO1標準輸出(默認為屏幕)STDERR_FILENO2標準錯誤輸出(默認為屏幕)
注:早期的UNIX版本采用的上限值是19(允許每個進程打開20個文件),對于現(xiàn)在的很多系統(tǒng)其值有變化。5.3基本APIopen函數(shù)creat函數(shù)read函數(shù)write函數(shù)close函數(shù)lseek函數(shù)fcntl函數(shù)ioctl函數(shù)select實現(xiàn)I/O復(fù)用5.3.1基本API——open函數(shù)#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int
open(constchar*pathname,int
oflag, …/*,mode_tmode*/);功能:打開文件返回:若成功為文件描述符,若出錯為-1參數(shù):參數(shù)名功能說明取值pathname要打開或創(chuàng)建的文件的名字oflag說明對文件的操作方式由<fcntl.h>頭文件中的常數(shù)定義構(gòu)成參見下面的取值表mode新建文件的權(quán)限設(shè)置僅當(dāng)創(chuàng)建新文件時才使用該參數(shù)八進制表示的權(quán)限值O_RDONLY只讀打開。O_WRONLY只寫打開。O_RDWR讀、寫打開。O_APPEND追加方式寫O_CREAT文件不存在時創(chuàng)建O_EXCL結(jié)合O_CREAT使用。如果文件存在,返回錯誤;如果文件不存在,則創(chuàng)建文件O_TRUNC如果此文件存在,而且為只讀或只寫成功打開,則將其長度截短為0。O_NOCTTY如果pathname指的是終端設(shè)備,則不將此設(shè)備分配作為此進程的控制終端。O_NONBLOCK如果pathname指的是一個FIFO、一個塊特殊文件或一個字符特殊文件,則此選擇項為此文件的本次打開操作和后續(xù)的I/O操作設(shè)置非阻塞方式O_SYNC使每次write都等到物理I/O操作完成。1、Oflag的設(shè)置#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<stdio.h>int
main(int
argc,char*argv[]){
int
fd;
fd=open(“./aa.c”,O_TRUNC);
if(fd==-1) {
perror(“fail\n”);
} else {
perror("success\n");
close(fd); } return0;}實例:清空文件(刪除文件的全部內(nèi)容)__即將文件的長度截短為0即O_TRUNC源代碼/*文件aa.c不存在,open出錯,返回-1。成功執(zhí)行后,aa.c文件中的內(nèi)容將被清除*//*perror(char*msg)完成輸出msg,并輸出perror的執(zhí)行情況,格式為“msg內(nèi)容:執(zhí)行結(jié)果提示”*/open("./aa.c",O_TRUNC);open("./aa.c",O_RDWR|O_CREAT,0666);open("./aa.c",O_RDWR|O_TRUNC);open("./aa.c",O_RDWR|O_APPEND);open("./aa.c",O_RDWR|O_CREAT|O_EXCL);open("./aa.c",O_RDWR|O_CREAT|O_EXCL,0666);
demo1demo2實例:分析并使用代碼測試以下open函數(shù)的功能注意:Oflag的多個值間使用“|”分開Open函數(shù)中使用八進制指定ugo的權(quán)限2、mode的設(shè)置參考文件權(quán)限設(shè)置命令注意:mode在open中使用八進制,以數(shù)字“0”開頭【補充】命令“mkdir-m權(quán)限文件或路徑”與“chmod
權(quán)限文件或路徑”權(quán)限mode
的設(shè)置
格式一:[ugoa][+-=][rwx][,...] 格式二:mode可以是數(shù)字字符串其中
u
表示該檔案的擁有者g
表示與該檔案的擁有者屬于同一個群體(group)者o
表示其他以外的人a
表示這三者皆是
+
表示增加權(quán)限-
表示取消權(quán)限=
表示唯一設(shè)定權(quán)限
r
表示可讀取,對應(yīng)8進制值為4w
表示可寫入,對應(yīng)8進制值為2x
表示可執(zhí)行,對應(yīng)8進制值為1例題:采用格式一和格式二等同mkdir-m
a=rwx
file和mkdir-m0777
file
效果相同mkdir-m
ug=rwx,o=x
file
和mkdir-m
0771
file
效果相同
例題:使用“chmod
權(quán)限文件或路徑”改變文件或路徑的權(quán)限注意:上面的mkdir和chmod命令中的mode可以使用八進制(如0777)5.3.2基本API——creat函數(shù)#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int
creat(constchar*pathname,mode_t
mode);功能:創(chuàng)建一個新文件。返回:若成功,返回只寫方式打開的文件描述符,若出錯返回-1。注意:(1)此函數(shù)等效于:open(pathname,O_WRONLY|O_CREAT|O_TRUNC, mode);見例:demo3.c5.3.3基本API——read函數(shù)#include<unistd.h>ssize_t
read(int
fd,void*buff,size_t
nbytes);功能:從打開文件中讀數(shù)據(jù)返回:read成功,則返回讀到的字節(jié)數(shù)。如已到達文件的尾端,則返回0。若出錯為-1。參數(shù):參數(shù)名功能說明取值fd被讀取文件的文件描述open或creat的返回值buff讀取到的數(shù)據(jù)在內(nèi)存中的位置一般為字符數(shù)組名nbytes期望本次讀到的最大長度字符數(shù)一般為字符數(shù)組的長度注意:(1)讀操作從文件的當(dāng)前位移量處開始,在成功返回之前,該位移量增加實際讀得的字節(jié)數(shù)。(2)有多種情況可使實際讀到的字節(jié)數(shù)少于要求讀字節(jié)數(shù):讀普通文件時,在讀到要求字節(jié)數(shù)之前已到達了文件尾端。例如,若在到達文件尾端之前還有30個字節(jié),而要求讀100個字節(jié),則read返回30,下一次再調(diào)用read時,它將返回0(文件尾端)。
當(dāng)從終端設(shè)備讀時,通常一次最多讀一行。
某些面向記錄的設(shè)備,例如磁帶,一次最多返回一個記錄。
當(dāng)從網(wǎng)絡(luò)讀時,網(wǎng)絡(luò)中的緩沖機制可能造成返回值小于所要求讀的字節(jié)數(shù)。使用規(guī)范:charrc[100];intnum=0;int
df=open(文件,讀權(quán)限);if(df!=-1){ num=read(df,rc,100);
while(num>0) { dosomething;num=read(df,rc,100); }
close(df);}見例:demo4.c補充內(nèi)容:判斷文件的存在性及權(quán)限補充:判讀文件的存在性及權(quán)限#include<unistd.h>
#include<fcntl.h>
int
access(constchar*pathname,intmode);
功能:檢查調(diào)用進程是否可以對指定的文件執(zhí)行某種操作。
參數(shù):pathname:需要測試的文件路徑名。
mode:需要測試的操作模式,可能值是一個或多個(組合體):R_OK(可讀?)W_OK(可寫?)X_OK(可執(zhí)行?)F_OK(文件存在?)返回:成功執(zhí)行時,返回0。失敗返回-1
見例:
demo5.c5.3.4基本API——write函數(shù)#include<unistd.h>ssize_t
write(int
fd,constvoid*buff,size_t
nbytes);功能:向打開文件寫數(shù)據(jù)返回:若成功為已寫的字節(jié)數(shù),若出錯為-1。注意:(1)其返回值通常與參數(shù)nbytes的值相同,否則表示出錯。write出錯的一個常見原因是:磁盤已寫滿。超過了對一個給定進程的文件長度限制。(2)對于普通文件,寫操作從文件的當(dāng)前位移量處開始。如果在打開該文件時,指定了O_APPEND選擇項,則在每次寫操作之前,將文件位移量設(shè)置在文件的當(dāng)前結(jié)尾處。在一次成功寫之后,該文件位移量增加實際寫的字節(jié)數(shù)。使用規(guī)范(一次性輸出字符串到文件):charrc[100]=字符串;//設(shè)字符串的最大長度為100intnum=0,TotalLong=strlen(rc);int
df=open(文件,寫權(quán)限);if(df!=-1){ //一次性輸出
if(num!=TotalLong) {
printf(“輸出錯誤!”); return0; } else {
printf(“成功輸出!”); }}見例:um=write(df,rc,TotalLong);使用規(guī)范(分次輸出字符串到文件):charrc[3000]=“…”;//設(shè)字符串的最大長度為3000char*prc=rc;intnum=0,TotalLong=strlen(rc);int
df=open(文件,寫權(quán)限);if(df!=-1){//每次希望輸出100個字符
while(num!=TotalLong) {
//修正偏移量
num=write(df,prc,100);
TotalLong=TotalLong-num; }}見例:demo7.c文件復(fù)制見例:um=write(df,prc,100);prc=prc+num;
//不能使用prc+100,由于num<=1005.3.5基本API——close函數(shù)#include<unistd.h>intclose(int
filedes);功能:關(guān)閉一個打開文件返回:若成功為0,若出錯為-1注意:當(dāng)一個進程終止時,它所有的打開文件都由內(nèi)核自動關(guān)閉。作為一個習(xí)慣好的程序員,應(yīng)該顯式地用close關(guān)閉打開的文件。5.3.6基本API——lseek函數(shù)1、當(dāng)前文件偏移量當(dāng)前文件偏移量是一個非負整數(shù),用以度量打開文件從文件開始處計算的字節(jié)數(shù)。通常,讀、寫操作都從當(dāng)前文件偏移量處開始,并使偏移量增加所讀或?qū)懙淖止?jié)數(shù)。按系統(tǒng)默認,當(dāng)打開一個文件時,除非指定O_APPEND選擇項,否則該位移量被設(shè)置為0??梢哉{(diào)用lseek顯式地定位一個打開文件的文件偏移量。2、lseek#include<sys/types.h>#include<unistd.h>off_t
lseek(int
fd,off_toffset,intwhence);功能:顯式地定位一個打開文件的文件偏移量。返回:若成功為新的文件位移,若出錯為-1。參數(shù):參數(shù)名功能說明取值fd被讀取文件的文件描述open或creat的返回值offset相對偏移量偏移量的值,可以有正負whence相對參考方式SEEK_SET:位移量=文件開始處+offset個字節(jié)SEEK_CUR:位移量=當(dāng)前位移量+offset個字節(jié)SEEK_END:位移量=文件長度+offset個字節(jié)見例注釋:demo9_1.c見例:demo9.c補充STDOUT_FILENO補充:標準輸入,標準輸出,標準出錯1、unix系統(tǒng)調(diào)用中的標準輸入,標準輸出,標準出錯有兩組:STDOUT_FILENOSTDIN_FILENOSTDERR_FILENOstdin
stdout
stderr
2、相同點:STDOUT_FILENOSTDIN_FILENOSTDERR_FILENO和stdin
stdout
stderr
他們表示的意思是差不多的,都是unix系統(tǒng)調(diào)用中的標準輸入,標準輸出,標準出錯。補充:標準輸入,標準輸出,標準出錯3、區(qū)別:他們的類型是不一樣stdin等是FILE*類型,屬于標準I/O,在<stdio.h>。#include<stdio.h>externFILE*stdin;externFILE*stdout;externFILE*stderr;STDIN_FILENO等是文件描述符,是非負整數(shù),一般定義為0,1,2,屬于沒有buffer的I/O,直接調(diào)用系統(tǒng)調(diào)用,在<unistd.h>。在/usr/include/unistd.h中有如下定義:/*Standardfiledescriptors.*/#defineSTDIN_FILENO0/*Standardinput.*/#defineSTDOUT_FILENO1/*Standardoutput.*/#defineSTDERR_FILENO2/*Standarderroroutput.*/例題:#include<unistd.h>int
main(void){
intn;charbuf[100];
while(n=read(STDIN_FILENO,buf,100))//讀取標準輸入到buf中,返回讀取字節(jié)數(shù)。{
if(n!=write(STDOUT_FILENO,buf,n))//把buf
寫到標準輸出中
perror("writeerror");}
if(n<0)perror("readerror");return0;}1、標準終端運行結(jié)果:輸入一行,馬上輸出一行,也就是按照原樣輸出注意:終端輸入文件時,使用ctrl+d來輸入文件結(jié)束符demo10.c2、使用輸出重定向來運行可以使得輸入的字符串并不是輸出到終端,而是輸出到指定的文件中3、使用輸入輸出重定向來運行輸入的字符串可以不從鍵盤,而是從文件或已有的文件描述符中獲得分析wc命令,更多關(guān)于重定向命令參照”重定向”5.3.7基本API——fcntl函數(shù)#include<sys/types.h>#include<unistd.h>#include<fcntl.h>int
fcntl(int
fd,int
cmd);
int
fcntl(int
fd,int
cmd,longarg);
int
fcntl(int
fd,int
cmd,structflock*lock);功能:根據(jù)文件描述符來操作文件的特性
。參數(shù):參數(shù)名說明取值fd被操作的文件描述符cmd操作命令F_DUPFD復(fù)制一個現(xiàn)有的描述符F_GETFD或F_SETFD獲得/設(shè)置文件描述符標記
F_GETFL或F_SETFL獲得/設(shè)置文件狀態(tài)標記
F_GETOWN或F_SETOWN獲得/設(shè)置異步I/O所有權(quán)
F_GETLK,F_SETLK或F_SETLKW獲得/設(shè)置記錄鎖注意:F_SETFL將文件狀態(tài)標志設(shè)置為第三個參數(shù)的值(取為整型值)??梢愿牡膸讉€標志是:O_APPEND,O_NONBLOCK,O_SYNC,O_ASYNC。F_GETOWN取當(dāng)前接收SIGIO和SIGURG信號的進程ID或進程組ID。F_SETOWN設(shè)置接收SIGIO和SIGURG信號的進程ID或進程組ID。正的arg指定一個進程ID,負的arg表示等于arg絕對值的一個進程組ID。F_SETLKW是F_SETLK的阻塞版本(命令名中的W表示等待wait)。如果存在其他鎖,則調(diào)用進程睡眠;如果捕捉到信號則睡眠中斷
返回值:如果出錯,所有命令都返回-1,如果成功則返回某個其他值(返回值與命令cmd有關(guān))。
int
main(void){
int
fd,flag; if((fd=open("./test.txt",O_RDWR|O_APPEND|O_CREAT|O_TRUNC,0666))<0) {
perror("open"); exit(-1); }
write(fd,"yang",4);
lseek(fd,0,SEEK_SET);
write(fd,"zhu",3); return0;}
例題:獲得并修改文件狀態(tài)標記。代碼:demo11flag=fcntl(fd,F_GETFL);flag=flag&~O_APPENDfcntl(fd,F_SETFL,flag);int
fcntl(int
fd,int
cmd,structflock*lock);1、文件鎖的使用環(huán)境:在文件已經(jīng)共享的情況下,也就是當(dāng)多個用戶共同使用,操作一個文件的情況,這時LINUX通常采用的方法是給文件上鎖,來避免共享的資源產(chǎn)生競爭的狀態(tài)。補充:用fcntl給文件加鎖flock結(jié)構(gòu)體包含了設(shè)置記錄鎖的具體狀態(tài)成員flock的結(jié)構(gòu)如下所示:Structflock{shortl_type; /*鎖的類型,取值如下: F_RDLCK讀取鎖(共享鎖)F_WRLCK寫入鎖(排斥鎖)F_UNLCK解鎖*/off_t
l_start; //相對位移量(字節(jié))shortl_whence; /*相對位移量的起點,取值如下:SEEK_SET/SEEK_CUR/SEEK_END(同lseek的whence)*/off_t
l_len;//加鎖區(qū)域的長度pid_t
l_pid;}2、flock結(jié)構(gòu)注意:為加鎖整個文件,通常的方法是將l_start
說明為0,l_whence
說明為SEEK_SET,l_len
說明為0。例題:寫入鎖為互斥鎖,一個時刻只能有一個寫入鎖存在。代碼:demo12_1例題:讀取鎖為共享鎖,當(dāng)一個進程已設(shè)定讀取鎖后,另一個進程還可以設(shè)置讀取鎖。代碼:demo12_25.3.8基本API——ioctl函數(shù)#include<unistd.h>#include<sys/ioctl.h>int
ioctl(int
fd,int
cmd,...);功能:ioctl最主要使用在終端設(shè)備I/O控制。返回:若出錯則為-1,若成功則為其他值。參數(shù):參數(shù)名說明取值fd要控制的設(shè)備文件描述符cmd要設(shè)備完成的操作cmd參數(shù)cmd操作的參數(shù)代碼:demo13#include<sys/types.h>#include<sys/time.h>#include<unistd.h>intselect(int
maxfd,
fd_set*readset, fd_set*writeset,
fd_set*exceptset, conststructtimeval*timeout);功能:同時監(jiān)控多個文件描述符上是否有輸入、輸出、錯誤。返回:準備就緒的描述符數(shù),若超時則為0,若出錯則為-1。5.3.9基本API——
select函數(shù)參數(shù)名說明取值maxfd要被監(jiān)控的描述符個數(shù)最大fd+1readset被監(jiān)控的是否有輸入的文件描述符集初始化時,被監(jiān)控描述字的相應(yīng)位置0;調(diào)用select后,未就就緒設(shè)備的相應(yīng)位被置為0,就緒位置為1writeset被監(jiān)控的是否有輸出的文件描述符集exceptset被監(jiān)控的是否有錯誤產(chǎn)生的文件描述符集timeval監(jiān)控的超時時間structtimeval類型的指針。參見timeval取值參見文件描述符集操作宏函數(shù)代碼:demo17select函數(shù)根據(jù)希望進行的文件操作對文件描述符進行分類處理,對文件描述符的處理主要設(shè)計4個宏函數(shù):FD_ZERO(fd_set*set) 清除一個文件描述符集;FD_SET(int
fd,fd_set*set) 將一個文件描述符加入文件描述符集中;FD_CLR(int
fd,fd_set*set)
將一個文件描述符從文件描述符集中清除;FD_ISSET(int
fd,fd_set*set)
測試該集中的一個給定位是否有變化;文件描述符集操作宏函數(shù)參數(shù)名說明取值maxfd要被監(jiān)控的描述符個數(shù)最大fd+1readset被監(jiān)控的是否有輸入的文件描述符集初始化時,被監(jiān)控描述字的相應(yīng)位置0;調(diào)用select后,未就就緒設(shè)備的相應(yīng)位被置為0,就緒位置為1writeset被監(jiān)控的是否有輸出的文件描述符集exceptset被監(jiān)控的是否有錯誤產(chǎn)生的文件描述符集timeval監(jiān)控的超時時間structtimeval類型的指針。參見timeval取值參見文件描述符集操作宏函數(shù)代碼:demo17timeval取值NULL:永遠等待,直到捕捉到信號或文件描述符已準備好為止;具體值:
structtimeval類型的指針,若等待為timeout時間還沒有文件描述符準備好,就立即返回;0:從不等待,測試所有指定的描述符并立即返回;structtimeval{longtv_sec;/*seconds*/longtv_usec;/*microseconds*/};timeval結(jié)構(gòu)體代碼:demo14#include<sys/time.h>int
gettimeofday(struct
timeva
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 檢驗員個人工作總結(jié)范文(19篇)
- 大學(xué)教師期末工作總結(jié)(4篇)
- 園林造型施工方案
- 《心房顫動心電圖》課件
- 初中自我評價怎么寫100字(5篇)
- 市中心小區(qū)個人房屋租賃合同(16篇)
- 內(nèi)河整治施工方案
- 2025年淮北貨運從業(yè)資格證考試題及答案
- 小學(xué)班干部競選稿(18篇)
- 2025年杭州貨運從業(yè)資格證考試試題答案解析
- 領(lǐng)悟社會支持量表(PSSS)
- 可燃氣體報警儀檢驗記錄
- 自動控制原理全套ppt課件(完整版)
- 手衛(wèi)生相關(guān)知識考核試題與答案
- 《同分母分數(shù)加減法》教學(xué)課件人教新課標
- 產(chǎn)業(yè)經(jīng)濟學(xué)第三版(蘇東水)課后習(xí)題及答案完整版
- 初中綜合實踐課程標準
- 首件檢驗記錄表(標準樣版)
- 中建六局建設(shè)發(fā)展公司責(zé)任目標管理考核辦法
- 太陽能光伏發(fā)電系統(tǒng)PVsyst運用
- 壓實瀝青混合料密度(表干法)自動計算
評論
0/150
提交評論