




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
5.1文件I/O介紹可用的文件I/O函數——打開文件、讀文件、寫文件等等。大多數linux文件I/O只需用到5個函數:open、read、write、lseek
以及close。 不帶緩存指的是每個read和write都調用內核中的一個系統調用。這些不帶緩存的I/O函數不是ANSIC的組成部分,但是POSIX組成部分。5.2文件描述符對于內核而言,所有打開文件都由文件描述符引用。當打開一個現存文件或創建一個新文件時,內核向進程返回一個文件描述符。當讀、寫一個文件時,用open或creat返回的文件描述符標識該文件,將其作為參數傳送給read或write。文件描述符是一個非負整數。文件描述符的范圍是0~OPEN_MAX。其中0、1、2分別被代換為符號常量,系統留用:STDIN_FILENO0標準輸入(默認為鍵盤)STDOUT_FILENO1標準輸出(默認為屏幕)STDERR_FILENO2標準錯誤輸出(默認為屏幕)
注:早期的UNIX版本采用的上限值是19(允許每個進程打開20個文件),對于現在的很多系統其值有變化。5.3基本APIopen函數creat函數read函數write函數close函數lseek函數fcntl函數ioctl函數select實現I/O復用5.3.1基本API——open函數#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int
open(constchar*pathname,int
oflag, …/*,mode_tmode*/);功能:打開文件返回:若成功為文件描述符,若出錯為-1參數:參數名功能說明取值pathname要打開或創建的文件的名字oflag說明對文件的操作方式由<fcntl.h>頭文件中的常數定義構成參見下面的取值表mode新建文件的權限設置僅當創建新文件時才使用該參數八進制表示的權限值O_RDONLY只讀打開。O_WRONLY只寫打開。O_RDWR讀、寫打開。O_APPEND追加方式寫O_CREAT文件不存在時創建O_EXCL結合O_CREAT使用。如果文件存在,返回錯誤;如果文件不存在,則創建文件O_TRUNC如果此文件存在,而且為只讀或只寫成功打開,則將其長度截短為0。O_NOCTTY如果pathname指的是終端設備,則不將此設備分配作為此進程的控制終端。O_NONBLOCK如果pathname指的是一個FIFO、一個塊特殊文件或一個字符特殊文件,則此選擇項為此文件的本次打開操作和后續的I/O操作設置非阻塞方式O_SYNC使每次write都等到物理I/O操作完成。1、Oflag的設置#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;}實例:清空文件(刪除文件的全部內容)__即將文件的長度截短為0即O_TRUNC源代碼/*文件aa.c不存在,open出錯,返回-1。成功執行后,aa.c文件中的內容將被清除*//*perror(char*msg)完成輸出msg,并輸出perror的執行情況,格式為“msg內容:執行結果提示”*/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函數的功能注意:Oflag的多個值間使用“|”分開Open函數中使用八進制指定ugo的權限2、mode的設置參考文件權限設置命令注意:mode在open中使用八進制,以數字“0”開頭【補充】命令“mkdir-m權限文件或路徑”與“chmod
權限文件或路徑”權限mode
的設置
格式一:[ugoa][+-=][rwx][,...] 格式二:mode可以是數字字符串其中
u
表示該檔案的擁有者g
表示與該檔案的擁有者屬于同一個群體(group)者o
表示其他以外的人a
表示這三者皆是
+
表示增加權限-
表示取消權限=
表示唯一設定權限
r
表示可讀取,對應8進制值為4w
表示可寫入,對應8進制值為2x
表示可執行,對應8進制值為1例題:采用格式一和格式二等同mkdir-m
a=rwx
file和mkdir-m0777
file
效果相同mkdir-m
ug=rwx,o=x
file
和mkdir-m
0771
file
效果相同
例題:使用“chmod
權限文件或路徑”改變文件或路徑的權限注意:上面的mkdir和chmod命令中的mode可以使用八進制(如0777)5.3.2基本API——creat函數#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>int
creat(constchar*pathname,mode_t
mode);功能:創建一個新文件。返回:若成功,返回只寫方式打開的文件描述符,若出錯返回-1。注意:(1)此函數等效于:open(pathname,O_WRONLY|O_CREAT|O_TRUNC, mode);見例:demo3.c5.3.3基本API——read函數#include<unistd.h>ssize_t
read(int
fd,void*buff,size_t
nbytes);功能:從打開文件中讀數據返回:read成功,則返回讀到的字節數。如已到達文件的尾端,則返回0。若出錯為-1。參數:參數名功能說明取值fd被讀取文件的文件描述open或creat的返回值buff讀取到的數據在內存中的位置一般為字符數組名nbytes期望本次讀到的最大長度字符數一般為字符數組的長度注意:(1)讀操作從文件的當前位移量處開始,在成功返回之前,該位移量增加實際讀得的字節數。(2)有多種情況可使實際讀到的字節數少于要求讀字節數:讀普通文件時,在讀到要求字節數之前已到達了文件尾端。例如,若在到達文件尾端之前還有30個字節,而要求讀100個字節,則read返回30,下一次再調用read時,它將返回0(文件尾端)。
當從終端設備讀時,通常一次最多讀一行。
某些面向記錄的設備,例如磁帶,一次最多返回一個記錄。
當從網絡讀時,網絡中的緩沖機制可能造成返回值小于所要求讀的字節數。使用規范:charrc[100];intnum=0;int
df=open(文件,讀權限);if(df!=-1){ num=read(df,rc,100);
while(num>0) { dosomething;num=read(df,rc,100); }
close(df);}見例:demo4.c補充內容:判斷文件的存在性及權限補充:判讀文件的存在性及權限#include<unistd.h>
#include<fcntl.h>
int
access(constchar*pathname,intmode);
功能:檢查調用進程是否可以對指定的文件執行某種操作。
參數:pathname:需要測試的文件路徑名。
mode:需要測試的操作模式,可能值是一個或多個(組合體):R_OK(可讀?)W_OK(可寫?)X_OK(可執行?)F_OK(文件存在?)返回:成功執行時,返回0。失敗返回-1
見例:
demo5.c5.3.4基本API——write函數#include<unistd.h>ssize_t
write(int
fd,constvoid*buff,size_t
nbytes);功能:向打開文件寫數據返回:若成功為已寫的字節數,若出錯為-1。注意:(1)其返回值通常與參數nbytes的值相同,否則表示出錯。write出錯的一個常見原因是:磁盤已寫滿。超過了對一個給定進程的文件長度限制。(2)對于普通文件,寫操作從文件的當前位移量處開始。如果在打開該文件時,指定了O_APPEND選擇項,則在每次寫操作之前,將文件位移量設置在文件的當前結尾處。在一次成功寫之后,該文件位移量增加實際寫的字節數。使用規范(一次性輸出字符串到文件):charrc[100]=字符串;//設字符串的最大長度為100intnum=0,TotalLong=strlen(rc);int
df=open(文件,寫權限);if(df!=-1){ //一次性輸出
if(num!=TotalLong) {
printf(“輸出錯誤!”); return0; } else {
printf(“成功輸出!”); }}見例:um=write(df,rc,TotalLong);使用規范(分次輸出字符串到文件):charrc[3000]=“…”;//設字符串的最大長度為3000char*prc=rc;intnum=0,TotalLong=strlen(rc);int
df=open(文件,寫權限);if(df!=-1){//每次希望輸出100個字符
while(num!=TotalLong) {
//修正偏移量
num=write(df,prc,100);
TotalLong=TotalLong-num; }}見例:demo7.c文件復制見例:um=write(df,prc,100);prc=prc+num;
//不能使用prc+100,由于num<=1005.3.5基本API——close函數#include<unistd.h>intclose(int
filedes);功能:關閉一個打開文件返回:若成功為0,若出錯為-1注意:當一個進程終止時,它所有的打開文件都由內核自動關閉。作為一個習慣好的程序員,應該顯式地用close關閉打開的文件。5.3.6基本API——lseek函數1、當前文件偏移量當前文件偏移量是一個非負整數,用以度量打開文件從文件開始處計算的字節數。通常,讀、寫操作都從當前文件偏移量處開始,并使偏移量增加所讀或寫的字節數。按系統默認,當打開一個文件時,除非指定O_APPEND選擇項,否則該位移量被設置為0。可以調用lseek顯式地定位一個打開文件的文件偏移量。2、lseek#include<sys/types.h>#include<unistd.h>off_t
lseek(int
fd,off_toffset,intwhence);功能:顯式地定位一個打開文件的文件偏移量。返回:若成功為新的文件位移,若出錯為-1。參數:參數名功能說明取值fd被讀取文件的文件描述open或creat的返回值offset相對偏移量偏移量的值,可以有正負whence相對參考方式SEEK_SET:位移量=文件開始處+offset個字節SEEK_CUR:位移量=當前位移量+offset個字節SEEK_END:位移量=文件長度+offset個字節見例注釋:demo9_1.c見例:demo9.c補充STDOUT_FILENO補充:標準輸入,標準輸出,標準出錯1、unix系統調用中的標準輸入,標準輸出,標準出錯有兩組:STDOUT_FILENOSTDIN_FILENOSTDERR_FILENOstdin
stdout
stderr
2、相同點:STDOUT_FILENOSTDIN_FILENOSTDERR_FILENO和stdin
stdout
stderr
他們表示的意思是差不多的,都是unix系統調用中的標準輸入,標準輸出,標準出錯。補充:標準輸入,標準輸出,標準出錯3、區別:他們的類型是不一樣stdin等是FILE*類型,屬于標準I/O,在<stdio.h>。#include<stdio.h>externFILE*stdin;externFILE*stdout;externFILE*stderr;STDIN_FILENO等是文件描述符,是非負整數,一般定義為0,1,2,屬于沒有buffer的I/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中,返回讀取字節數。{
if(n!=write(STDOUT_FILENO,buf,n))//把buf
寫到標準輸出中
perror("writeerror");}
if(n<0)perror("readerror");return0;}1、標準終端運行結果:輸入一行,馬上輸出一行,也就是按照原樣輸出注意:終端輸入文件時,使用ctrl+d來輸入文件結束符demo10.c2、使用輸出重定向來運行可以使得輸入的字符串并不是輸出到終端,而是輸出到指定的文件中3、使用輸入輸出重定向來運行輸入的字符串可以不從鍵盤,而是從文件或已有的文件描述符中獲得分析wc命令,更多關于重定向命令參照”重定向”5.3.7基本API——fcntl函數#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);功能:根據文件描述符來操作文件的特性
。參數:參數名說明取值fd被操作的文件描述符cmd操作命令F_DUPFD復制一個現有的描述符F_GETFD或F_SETFD獲得/設置文件描述符標記
F_GETFL或F_SETFL獲得/設置文件狀態標記
F_GETOWN或F_SETOWN獲得/設置異步I/O所有權
F_GETLK,F_SETLK或F_SETLKW獲得/設置記錄鎖注意:F_SETFL將文件狀態標志設置為第三個參數的值(取為整型值)。可以更改的幾個標志是:O_APPEND,O_NONBLOCK,O_SYNC,O_ASYNC。F_GETOWN取當前接收SIGIO和SIGURG信號的進程ID或進程組ID。F_SETOWN設置接收SIGIO和SIGURG信號的進程ID或進程組ID。正的arg指定一個進程ID,負的arg表示等于arg絕對值的一個進程組ID。F_SETLKW是F_SETLK的阻塞版本(命令名中的W表示等待wait)。如果存在其他鎖,則調用進程睡眠;如果捕捉到信號則睡眠中斷
返回值:如果出錯,所有命令都返回-1,如果成功則返回某個其他值(返回值與命令cmd有關)。
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;}
例題:獲得并修改文件狀態標記。代碼:demo11flag=fcntl(fd,F_GETFL);flag=flag&~O_APPENDfcntl(fd,F_SETFL,flag);int
fcntl(int
fd,int
cmd,structflock*lock);1、文件鎖的使用環境:在文件已經共享的情況下,也就是當多個用戶共同使用,操作一個文件的情況,這時LINUX通常采用的方法是給文件上鎖,來避免共享的資源產生競爭的狀態。補充:用fcntl給文件加鎖flock結構體包含了設置記錄鎖的具體狀態成員flock的結構如下所示:Structflock{shortl_type; /*鎖的類型,取值如下: F_RDLCK讀取鎖(共享鎖)F_WRLCK寫入鎖(排斥鎖)F_UNLCK解鎖*/off_t
l_start; //相對位移量(字節)shortl_whence; /*相對位移量的起點,取值如下:SEEK_SET/SEEK_CUR/SEEK_END(同lseek的whence)*/off_t
l_len;//加鎖區域的長度pid_t
l_pid;}2、flock結構注意:為加鎖整個文件,通常的方法是將l_start
說明為0,l_whence
說明為SEEK_SET,l_len
說明為0。例題:寫入鎖為互斥鎖,一個時刻只能有一個寫入鎖存在。代碼:demo12_1例題:讀取鎖為共享鎖,當一個進程已設定讀取鎖后,另一個進程還可以設置讀取鎖。代碼:demo12_25.3.8基本API——ioctl函數#include<unistd.h>#include<sys/ioctl.h>int
ioctl(int
fd,int
cmd,...);功能:ioctl最主要使用在終端設備I/O控制。返回:若出錯則為-1,若成功則為其他值。參數:參數名說明取值fd要控制的設備文件描述符cmd要設備完成的操作cmd參數cmd操作的參數代碼: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);功能:同時監控多個文件描述符上是否有輸入、輸出、錯誤。返回:準備就緒的描述符數,若超時則為0,若出錯則為-1。5.3.9基本API——
select函數參數名說明取值maxfd要被監控的描述符個數最大fd+1readset被監控的是否有輸入的文件描述符集初始化時,被監控描述字的相應位置0;調用select后,未就就緒設備的相應位被置為0,就緒位置為1writeset被監控的是否有輸出的文件描述符集exceptset被監控的是否有錯誤產生的文件描述符集timeval監控的超時時間structtimeval類型的指針。參見timeval取值參見文件描述符集操作宏函數代碼:demo17select函數根據希望進行的文件操作對文件描述符進行分類處理,對文件描述符的處理主要設計4個宏函數: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)
測試該集中的一個給定位是否有變化;文件描述符集操作宏函數參數名說明取值maxfd要被監控的描述符個數最大fd+1readset被監控的是否有輸入的文件描述符集初始化時,被監控描述字的相應位置0;調用select后,未就就緒設備的相應位被置為0,就緒位置為1writeset被監控的是否有輸出的文件描述符集exceptset被監控的是否有錯誤產生的文件描述符集timeval監控的超時時間structtimeval類型的指針。參見timeval取值參見文件描述符集操作宏函數代碼:demo17timeval取值NULL:永遠等待,直到捕捉到信號或文件描述符已準備好為止;具體值:
structtimeval類型的指針,若等待為timeout時間還沒有文件描述符準備好,就立即返回;0:從不等待,測試所有指定的描述符并立即返回;structtimeval{longtv_sec;/*seconds*/longtv_usec;/*microseconds*/};timeval結構體代碼:demo14#include<sys/time.h>int
gettimeofday(struct
timeva
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個性課件開頭介紹
- 運輸服務合同模板
- 三方產品分銷合同范本
- 綜合建筑工程施工合同
- 普法宣講【法律學堂】第十八章 行政答辯狀-ldfjxs004
- 四川省南充市廣安市廣安中學2025屆初三調研考試(語文試題)試卷含解析
- 陶瓷酒瓶采購合同
- 上海杉達學院《實時操作系統》2023-2024學年第二學期期末試卷
- 江蘇信息職業技術學院《工程圖學2》2023-2024學年第二學期期末試卷
- 陜西雇傭合同
- 2023年鄭州信息工程職業學院單招職業適應性測試筆試模擬試題及答案解析
- 好書推薦-《三毛流浪記》77955課件
- 領悟社會支持量表(PSSS)
- 自動控制原理全套ppt課件(完整版)
- 手衛生相關知識考核試題與答案
- 《同分母分數加減法》教學課件人教新課標
- 產業經濟學第三版(蘇東水)課后習題及答案完整版
- 初中綜合實踐課程標準
- 首件檢驗記錄表(標準樣版)
- 中建六局建設發展公司責任目標管理考核辦法
- 太陽能光伏發電系統PVsyst運用
評論
0/150
提交評論