第26課-庫函數(shù)方式文件編程_第1頁
第26課-庫函數(shù)方式文件編程_第2頁
第26課-庫函數(shù)方式文件編程_第3頁
第26課-庫函數(shù)方式文件編程_第4頁
第26課-庫函數(shù)方式文件編程_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第26課LINUX文件編程

(庫函數(shù))庫函數(shù)基于C函數(shù)庫的文件編程是獨立于具體的操作系統(tǒng)平臺的,不管是在Windows、Linux還是其他的操作系統(tǒng)中,都是使用這些函數(shù)。使用庫函數(shù)進行程序設(shè)計可提高程序的可移植性。流對于標(biāo)準(zhǔn)的C函數(shù)庫,它們的操作都是圍繞流來進行的。流是一個抽象的概念,當(dāng)程序需要

數(shù)據(jù)的時候,就會開啟一個通向數(shù)據(jù)源的流,這個數(shù)據(jù)源可以是文件,內(nèi)存,或是網(wǎng)絡(luò)連接。類似的,當(dāng)程序需要寫入數(shù)據(jù)的時候,就會開啟一個通向目的地的流。這時候你就可以想象數(shù)據(jù)好像在這其中“流”動一樣。流文件指針在系統(tǒng)調(diào)用方式實現(xiàn)的文件

中,使用文件描述符(一個整數(shù))來指向一個文件。在庫函數(shù)方式的文件

中,使用FILE類型來表示一個打開的文件,這個類型中包含了管理文件流的信息。而指向該類型的指針FILE*

則被稱之為文件指針。打開文件-fopen函數(shù)函數(shù)原型:FILE*

fopen(const

char

*filename,const

char

*mode)函數(shù)作用:創(chuàng)建一個新的文件/打開一個已有的文件所屬頭文件:<stdio.h>函數(shù)返回值:成功時,返回文件對象指針。失敗時返回NULL打開文件-fopen函數(shù)函數(shù)參數(shù):-filename:文件名(含路徑),如”/home/test.c”-mode:打開文件的模式,常見的創(chuàng)建模式有:r,

rbw,

wba,

ab只讀方式打開只寫方式打開,如果文件不存在,則創(chuàng)建該文件追加方式打開,如果文件不存在,則創(chuàng)建該文件r+,r+b,rb+

讀寫方式打開w+,w+b,wh+

讀寫方式打開,如果文件不存在,則創(chuàng)建該文件a+,a+b,ab+

讀和追加方式打開。如果文件不存在,則創(chuàng)建該文件關(guān)閉文件-fclose函數(shù)函數(shù)原型:int

fclose(FILE

*fp);函數(shù)作用:關(guān)閉打開的文件所屬頭文件:<stdio.h>函數(shù)參數(shù):fp:打開的文件指針函數(shù)返回值:成功時,返回0。失敗時返回EOF手把 你寫代碼打開/關(guān)閉文件讀文件-fread函數(shù)函數(shù)原型:size_t

fread(void

*

ptr,size_t

size,size_t

nmemb,FILE

*

fp);函數(shù)作用:從打開的文件中

數(shù)據(jù)。所屬頭文件:<stdio.h>函數(shù)返回值:返回實際

的塊數(shù)。讀文件-fread函數(shù)函數(shù)參數(shù):-ptr:讀出的數(shù)據(jù)保存的位置-size:每塊數(shù)據(jù)的長度-nmemb:讀多少塊數(shù)據(jù)-fp:打開的文件指針手把 你寫代碼讀文件寫文件-fwrite函數(shù)函數(shù)原型:size_t

fwrite(const

void

*

ptr,size_t

size,size_t

nmemb,FILE

*

fp);函數(shù)作用:向打開的文件中寫入數(shù)據(jù)。所屬頭文件:<stdio.h>函數(shù)返回值:返回實際寫入的塊數(shù)。寫文件-fwrite函數(shù)函數(shù)參數(shù):-ptr:待寫入的數(shù)據(jù)保存的位置-size:每塊數(shù)據(jù)的長度-nmemb:寫多少塊數(shù)據(jù)-fp:打開的文件指針手把 你寫代碼寫文件定位文件-fseek函數(shù)函數(shù)原型:int

fseek(FILE

*

fp,long

offset,int

whence)函數(shù)作用:調(diào)整文件讀寫位置,作用等同于lseek.所屬頭文件:<stdio.h>函數(shù)返回值:成功時則返回0,錯誤則返回-1定位文件-fseek函數(shù)函數(shù)參數(shù):-fp:要調(diào)整的文件-whence:從什么位置可以調(diào)整SEEK_SET

文件開頭SEEK_CUR

當(dāng)前的讀寫位置SEEK_END

文件尾-offset:相對調(diào)整起始位置的偏移量手把 你寫代碼定位文件格式化輸出-fprintf函數(shù)函數(shù)原型:int

fprintf(FILE

*

fp

,const

char

*format,....)函數(shù)作用:將數(shù)據(jù)格式化以后輸出到文件所屬頭文件:<stdio.h>函數(shù)返回值:成功時則返回參數(shù)個數(shù),錯誤則返回-1格式化輸出-fprintf函數(shù)函數(shù)參數(shù):-fp:要輸出的文件-format:需要轉(zhuǎn)化的格式手把 你寫代碼格式化輸出Contents系統(tǒng)調(diào)用方式文件編程庫函數(shù)方式文件編程文件高級編程技術(shù)1.阻塞型IO圖示+思考?當(dāng)我們使用read/write

某些文件(比如:管道文件,終端文件)的時候,如果文件暫時滿足不了我們的要求。Linux系統(tǒng)該如何處理?例如:我們從鍵盤終端讀入數(shù)據(jù),但是這時鍵盤上沒有敲入按鍵的時候,系統(tǒng)如何處理?阻塞型IO實例演示非阻塞型IO如何將系統(tǒng)默認的阻塞型IO方式修改為非阻塞型IO呢?O_NONBLOCK手把 你寫代碼非阻塞型IO非阻塞型IO除了在打開文件的時候設(shè)置非阻塞標(biāo)志O_NONBLOCK還有其他的辦法來設(shè)置非阻塞標(biāo)志嗎?修改文件屬性tl函數(shù)函數(shù)原型:int

fcntl(int

fd,

int

cmd);int

fcntl(int

fd,

int

cmd,

long

arg);int

fcntl(int

fd,

int

cmd,

struct

flock

*lock);函數(shù)作用:一個現(xiàn)有的描述符(cmd=F_DUPFD).獲得/設(shè)置文件描述符標(biāo)記(cmd=F_GETFD或F_SETFD).獲得/設(shè)置文件狀態(tài)標(biāo)記(cmd=F_GETFL或F_SETFL).獲得/設(shè)置異步I/O所

(cmd=F_GETOWN或F_SETOWN).獲得/設(shè)置記錄鎖(cmd=F_GETLK,F_SETLK或F_SETLKW).修改文件屬性tl函數(shù)所屬頭文件:<fcntl.h>函數(shù)參數(shù):-fd:要操作的文件描述符-cmd:對文件的控制命令-arg:

cmd所需要的參數(shù)手把 你寫代碼設(shè)置文件標(biāo)志2.多路復(fù)用-select圖解:為什么我們需要select?多路復(fù)用-select函數(shù)函數(shù)原型:int

select(int

maxfd,

fd_set

*readfds,

fd_set

*writefds,

fe_set*exceptfds,

const

struct timeval

*timeout)函數(shù)作用:同時 多個文件,如果有一個文件滿足要求,函數(shù)返回。當(dāng)沒有文件滿足要求的時候,函數(shù)可能阻塞。所屬頭文件:<unistd.h>返回值:成功時返回滿足要求的文件個數(shù),出錯時返回-1.多路復(fù)用-select函數(shù)函數(shù)參數(shù):-maxfd:

的最大的文件描述符+1-readfds:要進行讀-writefds:要進行寫的文件集合的文件集合的文件集合-exceptfds:要進行異常-timeout:阻塞時間NULL:一直阻塞0:不阻塞,立即返回特定的時間值:當(dāng)沒有文件滿足要求時,阻塞的時間多路復(fù)用-select函數(shù)Linux系統(tǒng)提供了一系列宏來幫助我們操作文件集合:FD_ZERO(fd_set

*fdset)清空文件集合fdsetFD_SET(intfd,

fd_set

*fdset)將fd所指代的文件加入文件集合fdsetFD_CLR(int

fd,

fd_set

*fdset)將fd所指代的文件從文件集合fdset中去除FD_ISSET(int

fd,

fd_set

*fdset)判斷fd所指的文件是否在文件集合fdset中。在調(diào)用select后,不滿足要求的文件將會被select函數(shù)從文件集合中清除掉,仍然留在文件集合中的文件將是滿足要求的文件,因此使用FD_ISSET來檢測文件是否還在集合中來判斷文件是否滿足要求。手把 你寫代碼同時 多個文件3.文件-mmap文件

-mmap函數(shù)函數(shù)原型:void*

mmap

(void

*addr

,

size_t

len

,

int

prot

,

int

flags

,int

fd

,

off_t

offset

)函數(shù)作用:負責(zé)把文件內(nèi)容到進程的虛擬內(nèi)存空間,通過對這段內(nèi)存的和修改,來實現(xiàn)對文件的和修改,而不需要再調(diào)用read,write等操作。所屬頭文件:<unistd.h>返回值:

成功時返回的地址。文件-mmap函數(shù)函數(shù)參數(shù):-addr:指定的起始地址,通常設(shè)為NULL,由系統(tǒng)指定-length:-prot:到內(nèi)存的文件長度。區(qū)的保護方式,可以是:PROT_EXEC:PROT_READ:PROT_WRITE:區(qū)可被執(zhí)行區(qū)可被區(qū)可被寫入文件

-mmap函數(shù)函數(shù)參數(shù):-flags:區(qū)的特性,可以是:MAP_SHARED:寫入MAP_PRIVATE:對-fd:文件描述符,代表要區(qū)的數(shù)據(jù)會

回文件。區(qū)的寫入操作不會寫回原文件。文件。-offset:

從offset處開始取文件內(nèi)容來

,通常為0,表示從文件頭開始

。文件-munmap函數(shù)函數(shù)原型:int

munmap(void

*start,size_t

length)函數(shù)作用:解除文件所屬頭文件:<unistd.h>返回值:成功時返回0;失敗時返回-1.文件

-munmap函數(shù)函數(shù)參數(shù):-start:

取消 的地址-length:

取消 的長度手把 你寫代碼文件4.文件鎖圖解:為什么我們需要文件鎖文件鎖-分類排他鎖:如果事務(wù)T對文件A加上該鎖后,則其他事務(wù)不能再對A加任任何類型的鎖,直到在事務(wù)的末尾將資源上的鎖為止。獲取排他鎖的事務(wù)既能讀數(shù)據(jù),又能修改數(shù)據(jù)。共享鎖:如果事務(wù)T對數(shù)據(jù)A加上該鎖后,則其他事務(wù)只能對A再加共享鎖,不能加排他鎖,直到已所有共享鎖。獲準(zhǔn)共享鎖的事務(wù)只能讀數(shù)據(jù),不能修改數(shù)據(jù)。文件鎖-實現(xiàn)Linux有兩種方法可以實現(xiàn)文件鎖:使用

fcntl系統(tǒng)調(diào)用與使用lockf調(diào)用。我們會主要介紹fcntl接口,因為這是最經(jīng)常用到的接口。文件鎖

tl函數(shù)原型:int

fcntl

(int

fd,

int

cmd,

struct

flock

*lock);函數(shù)作用:對文件鎖進行操作所屬頭文件:<fcntl.h>文件鎖

tl函數(shù)參數(shù):-cmd:操作鎖

令F_SETLK:加鎖或。如果加鎖失敗,則fcntl立即返回,

此時errno被設(shè)置為EAGAIN。F_SETLKW:這是F_SETLK的阻塞版本。如果加鎖失敗,

則使調(diào)用進程休眠。F_GETLK:獲取文件的加鎖信息。注意:該命令并不會為文

件加鎖。成功時返回滿足要求的文件個數(shù),出錯時返回-1.文件鎖

tl函數(shù)參數(shù):-

struct

flockstruct

flock{shortoff_tl_type;l_

溫馨提示

  • 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論