




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、姓名:李向勇導(dǎo)師:?jiǎn)逃冷h時(shí)間:2016.1.9Linux文件操作1文件操作簡(jiǎn)介31.1概念31.2操作32 文件訪問(wèn)系統(tǒng)調(diào)用42.1 文件描述符42.2 write系統(tǒng)調(diào)用42.3read系統(tǒng)調(diào)用52.4open系統(tǒng)調(diào)用62.5close系統(tǒng)調(diào)用82.6ioctl系統(tǒng)調(diào)用8 3標(biāo)準(zhǔn)IO庫(kù)93.1 fopen函數(shù)104.2 fread/fwrite函數(shù)104.3 fclose函數(shù)114.4 fflush函數(shù)111文件操作簡(jiǎn)介在Linux中,一切皆文件,簡(jiǎn)單的說(shuō),C中基本的的printf()函數(shù),scanf()函數(shù),其實(shí)都屬于文件操作。對(duì)于文件操作,雖然都是通過(guò)函數(shù)調(diào)用的方式實(shí)現(xiàn),卻還是
2、能分為兩類:系統(tǒng)調(diào)用和庫(kù)函數(shù)。1.1概念按照普通的定義,文件不過(guò)是一堆數(shù)據(jù),在往下說(shuō),就是存儲(chǔ)器中的。而我們這里討論的文件有了更廣的定義。對(duì)于中的文件,我的理解是:中的文件具有的特點(diǎn)是:可通過(guò)操作系統(tǒng)或者程序?qū)ν馓峁┬畔?,也能?duì)內(nèi)輸入信息,可以被創(chuàng)建,刪除。inux中,文件有特別重要的意義,他們?yōu)椴僮飨到y(tǒng)和設(shè)備提供了一個(gè)簡(jiǎn)單而統(tǒng)一的接口。在中,幾乎一切都可以看做是文件 。這就意味著,普通程序完全可以像使用文件(普通定義)那樣使用磁盤文件、串行口、打印機(jī)和其他設(shè)備。硬件設(shè)備在linux操作系統(tǒng)中也被表示為文件。例如,可以通過(guò)如下命令把cd-rom驅(qū)動(dòng)器掛載為一個(gè)文件,#mount -t iso9
3、660 /dev/hdc /mnt/cdrom#cd /mnt/rom然后,就能像訪問(wèn)普通文件那樣在目錄中漫游。1.2操作和操作一般意義上的文件一樣,linux中對(duì)文件的操作只需要五個(gè)基本的函數(shù):open、close、read、write和ioctl通過(guò)調(diào)用這幾個(gè)函數(shù)就能對(duì)中的文件進(jìn)行讀、寫(xiě)等操作。不過(guò),這種操作又分為系統(tǒng)調(diào)用和庫(kù)函數(shù)調(diào)用。簡(jiǎn)單的說(shuō),系統(tǒng)調(diào)用是最直接的方式,庫(kù)函數(shù)調(diào)用最終也是通過(guò)系統(tǒng)調(diào)用實(shí)現(xiàn)的。可認(rèn)為庫(kù)函數(shù)調(diào)用是對(duì)系統(tǒng)調(diào)出于效率考慮而做出的優(yōu)化。庫(kù)函數(shù)調(diào)用和系統(tǒng)調(diào)用的區(qū)別和聯(lián)系請(qǐng)參看:linux系統(tǒng)調(diào)用和庫(kù)函數(shù)調(diào)用的區(qū)別我們用很少的函數(shù)就可以對(duì)文件和設(shè)備進(jìn)行訪問(wèn)和控制。這些函數(shù)
4、就是所謂的系統(tǒng)調(diào)用,由操作系統(tǒng)直接提供,他們是通向操作系統(tǒng)本身的接口。操作系統(tǒng)的核心部分,既內(nèi)核,其實(shí)就是一組設(shè)備驅(qū)動(dòng)程序。這是一些對(duì)硬件進(jìn)行控制的接口。2 文件訪問(wèn)系統(tǒng)調(diào)用通過(guò)系統(tǒng)調(diào)用來(lái)訪問(wèn)文件是最直接的方式。系統(tǒng)調(diào)用函數(shù)直接作用于操作系統(tǒng)內(nèi)核的設(shè)備驅(qū)動(dòng)程序從而實(shí)現(xiàn)文件訪問(wèn)。2.1 文件描述符在系統(tǒng)中需要處理的文件(讀、寫(xiě)操作)需要一個(gè)標(biāo)識(shí),以便在其它地方能識(shí)別出這個(gè)文件,于是就產(chǎn)生了文件描述符。文件描述符是一些小值整數(shù),簡(jiǎn)單的說(shuō)就是一個(gè)文件用于在系統(tǒng)中唯一的標(biāo)識(shí)文件。文件描述符的總數(shù)也就是系統(tǒng)可以打開(kāi)文件的最多個(gè)數(shù),這取決于系統(tǒng)的配置情況。當(dāng)開(kāi)始運(yùn)行程序時(shí),也就是系統(tǒng)開(kāi)始運(yùn)行時(shí),它一般會(huì)有
5、三個(gè)已經(jīng)打開(kāi)的文件描述符。他們是:· :標(biāo)準(zhǔn)輸入· :標(biāo)準(zhǔn)輸出· :標(biāo)準(zhǔn)錯(cuò)誤其它文件的文件描述符,在調(diào)用文件打開(kāi)函數(shù)時(shí)返回。這就是說(shuō),每個(gè)設(shè)備對(duì)應(yīng)著一個(gè)文件描述符。文件描述符由操作系統(tǒng)分配,每次分配最小的。2.2 write系統(tǒng)調(diào)用write,就是把緩沖區(qū)的數(shù)據(jù)寫(xiě)入文件中。注意,這里的文件時(shí)廣泛意義的文件,比如寫(xiě)入磁盤、寫(xiě)入打印機(jī)等等。Linux 中write()的函數(shù)原型:size_t write(int fildes, const void *buf, size_t nbytes);參數(shù)說(shuō)明:fildes:文件描述符,標(biāo)識(shí)了要寫(xiě)入的目標(biāo)文件。例如:fildes
6、的值為1,就像標(biāo)準(zhǔn)輸出寫(xiě)數(shù)據(jù),也就是在顯示屏上顯示數(shù)據(jù);如果為 2 ,則想標(biāo)注錯(cuò)誤寫(xiě)數(shù)據(jù)。*buf:待寫(xiě)入的文件,是一個(gè)字符串指針。nbytes:要寫(xiě)入的字符數(shù)。函數(shù)返回值:size_t 返回成功寫(xiě)入文件的字符數(shù)。需要指出的是,write可能會(huì)報(bào)告說(shuō)他寫(xiě)入的字節(jié)比你所要求的少。這并不一定是個(gè)錯(cuò)誤。在程序中,你需要檢查error已發(fā)現(xiàn)錯(cuò)誤,然后再次調(diào)用write寫(xiě)入剩余的數(shù)據(jù)。請(qǐng)看下面的例子:運(yùn)行結(jié)果:這個(gè)程序只在標(biāo)準(zhǔn)輸出上顯示一條消息。2.3read系統(tǒng)調(diào)用系統(tǒng)調(diào)用read是從文件中讀出數(shù)據(jù)。要讀取的文件用文件描述符標(biāo)識(shí),數(shù)據(jù)讀入一個(gè)事先定義好的緩沖區(qū)。他返回實(shí)際讀入的字節(jié)數(shù)。Li
7、nux中read的函數(shù)原型:size_t read(int fildes, void *buf, size_t nbytes);參數(shù)說(shuō)明:fildes:文件描述符,標(biāo)識(shí)要讀取的文件。如果為0,則從標(biāo)準(zhǔn)輸入讀數(shù)據(jù)。類似于scanf()的功能。*buf:緩沖區(qū),用來(lái)存儲(chǔ)讀入的數(shù)據(jù)。nbytes:要讀取的字符數(shù)。返回值:size_t返回成功讀取的字符數(shù),它可能會(huì)小于請(qǐng)求的字節(jié)數(shù)。運(yùn)行結(jié)果:2.4open系統(tǒng)調(diào)用系統(tǒng)調(diào)用open的作用是打開(kāi)一個(gè)文件,并返回這個(gè)文件的描述符。簡(jiǎn)單地說(shuō),open建立了一條到文件或設(shè)備的訪問(wèn)路徑。如果操作成功,它將返回一個(gè)文件描述符,read和write等系統(tǒng)調(diào)用使用該文件
8、描述符對(duì)文件或設(shè)備進(jìn)行操作。這個(gè)文件描述符是唯一的,他不會(huì)和任何其他運(yùn)行中的進(jìn)程共享。如果兩個(gè)程序同時(shí)打開(kāi)一個(gè)文件,會(huì)得到兩個(gè)不同的問(wèn)價(jià)描述符。如果同時(shí)對(duì)兩個(gè)文件進(jìn)行操作,他們各自操作,互補(bǔ)影響,彼此相互覆蓋(后寫(xiě)入的覆蓋先寫(xiě)入的)為了防止文件按讀寫(xiě)沖突,可以使用文件鎖的功能。這不是本次重點(diǎn),以后介紹。Linux中open的函數(shù)原型有兩個(gè):int open(const char *path, int oflags);int open(const char *path, int oflags, mode_t mode );參數(shù)說(shuō)明。path:準(zhǔn)備打開(kāi)的文件或設(shè)備名字。oflags:指出要打開(kāi)文件
9、的訪問(wèn)模式。open調(diào)用必須指定如下所示的文件訪問(wèn)模式之一:open調(diào)用哈可以在oflags參數(shù)中包括下列可選模式的組合(用”按位或“操作):· O_APPEDN: 把寫(xiě)入數(shù)據(jù)追加在文件的末尾。· O_TRUNC: 把文件長(zhǎng)度設(shè)為零,丟棄以后的內(nèi)容。· O_CREAT: 如果需要,就按參數(shù)mode中給出的訪問(wèn)模式創(chuàng)建文件。· O_EXCL: 與O_CREAT一起調(diào)用,確保調(diào)用者創(chuàng)建出文件。使用這個(gè)模式可防止兩個(gè)程序同時(shí)創(chuàng)建一個(gè)文件,如果文件已經(jīng)存在,open調(diào)用將失敗。 關(guān)于其他可能出現(xiàn)的oflags值,請(qǐng)看考o(jì)pen的調(diào)用手冊(cè)。m
10、ode:當(dāng)使用哦、O_CREAT標(biāo)志的open來(lái)創(chuàng)建文件時(shí),我們必須使用三個(gè)參數(shù)格式的open調(diào)用。第三個(gè)參數(shù)mode 是幾個(gè)標(biāo)志按位OR后得到的。他們是:· S_IRUSR: 讀權(quán)限,文件屬主。· S_IWUSR:寫(xiě)權(quán)限,文件屬主。· S_ IXUSR:執(zhí)行權(quán)限,文件屬主。· S_IRGRP:讀權(quán)限,文件所屬組。· S_IWGRP:寫(xiě)權(quán)限,文件所屬組。請(qǐng)看下面例子:open("myfile", O_CREAT, S_IRUSR|S_IXOTH ;他的作用是創(chuàng)建一個(gè)名為myfile 的文件,文件屬主擁有讀權(quán)限,其他
11、用戶擁有執(zhí)行權(quán)限,且只有這些權(quán)限。運(yùn)行結(jié)果:程序創(chuàng)建了一個(gè)名為myfile的文件,文件屬主有讀權(quán)限,其他用戶有執(zhí)行權(quán)限,且只有這些權(quán)限。2.5close系統(tǒng)調(diào)用close系統(tǒng)調(diào)用用于“關(guān)閉”一個(gè)文件,close調(diào)用終止一個(gè)文件描述符fildes以其文件之間的關(guān)聯(lián)。文件描述符被釋放,并能夠重新使用。close成功返回1,出錯(cuò)返回-1.#Include<unistd.h>int close(int fildes);2.6ioctl系統(tǒng)調(diào)用ioctl提供了一個(gè)用于控制設(shè)備及其描述符行為和配置底層服務(wù)的接口。終端、文件描述符、甚至磁帶機(jī)都可以又為他們定義的ioctl,具體細(xì)節(jié)可以參考特定設(shè)
12、備的使用手冊(cè)。下面是ioctl 的函數(shù)原型#include<unistd.h>int ioctl(int fildes, int cmd,);ioctl對(duì)描述符fildes指定的對(duì)象執(zhí)行cmd 參數(shù)中所給出的操作。 3庫(kù)函數(shù)在輸入、輸出操作中,直接使用系統(tǒng)調(diào)用效率會(huì)非常底。具體原因有二:· 系統(tǒng)調(diào)用會(huì)影響系統(tǒng)性能。與函數(shù)調(diào)用相比,系統(tǒng)調(diào)用的開(kāi)銷大。因?yàn)樵趫?zhí)行系統(tǒng)調(diào)用的時(shí)候,要切換到內(nèi)核代碼區(qū)執(zhí)行,然后再返回用戶代碼。這必然就需要大量的時(shí)間開(kāi)支。一種解決辦法是:盡量減少系統(tǒng)調(diào)用的次數(shù),讓每次系統(tǒng)調(diào)用完成盡可能多的 任務(wù)。例如每次系統(tǒng)調(diào)用寫(xiě)入大量的字符而不是單個(gè)字符
13、。· 硬件會(huì)對(duì)系統(tǒng)調(diào)用一次能讀寫(xiě)的數(shù)據(jù)塊做一定的限制。例如,磁帶機(jī)通常的寫(xiě)操作數(shù)據(jù)塊長(zhǎng)度是10k,如果縮寫(xiě)數(shù)據(jù)不是10k的整數(shù)倍,磁帶機(jī)還是會(huì)以10k為單位繞磁帶,這就在磁帶上留下空隙。為了提高文件訪問(wèn)操作的效率,并且使得文件操作變得更方便,Linux發(fā)行版提供了一系列的標(biāo)準(zhǔn)函數(shù)庫(kù)。他們是一些由函數(shù)構(gòu)成的集合,你可以在自己的程序方便的中使用它們,去操作文件。提供輸出緩沖功能的標(biāo)準(zhǔn)I/O庫(kù)就是這樣的例子。你可以高效的寫(xiě)任意長(zhǎng)度的數(shù)據(jù)塊,庫(kù)函數(shù)則在需要的時(shí)候安排底層函數(shù)調(diào)用(系統(tǒng)調(diào)用)也就是說(shuō),庫(kù)函數(shù)在用戶和系統(tǒng)之間,增加了一個(gè)中間層。如下圖所示:庫(kù)函數(shù)是根據(jù)實(shí)際需要而包裝好的系統(tǒng)調(diào)用,
14、用戶可在程序中方便的使用庫(kù)函數(shù),如標(biāo)準(zhǔn)I O庫(kù)(稍后會(huì)講4標(biāo)準(zhǔn)IO庫(kù)標(biāo)準(zhǔn)I/O庫(kù)及其頭文件<stdio.h>為底層I/O系統(tǒng)調(diào)用提供了一個(gè)通用的接口。這個(gè)庫(kù)現(xiàn)在已經(jīng)成為ANSI標(biāo)準(zhǔn)C的一部分,而前面所講的系統(tǒng)調(diào)用卻不是。標(biāo)準(zhǔn)I/O庫(kù)提供了許多復(fù)雜功能的函數(shù),用于格式化輸出和掃描輸入,它還負(fù)責(zé)滿足設(shè)備的緩沖需求。在許多方面,使用標(biāo)準(zhǔn)I/O庫(kù)和使用底層文件描述符類似。需要先打開(kāi)一個(gè)文件,已建立一個(gè)文件訪問(wèn)路徑(也就是系統(tǒng)調(diào)用中的文件描述符)在標(biāo)準(zhǔn)I/O庫(kù)中,與文件描述符對(duì)應(yīng)的叫 流(stream),它被實(shí)現(xiàn)為指向結(jié)構(gòu)FILE的指針。在啟動(dòng)程序時(shí),有三個(gè)文件流是自動(dòng)打開(kāi)的。他們是:
15、83; stdin: 標(biāo)準(zhǔn)輸入· stdout: 標(biāo)準(zhǔn)輸出· stderr: 標(biāo)準(zhǔn)錯(cuò)誤輸出下面會(huì)介紹一些常用的I/O庫(kù)函數(shù):4.1 fopen函數(shù)fopen函數(shù)類似于系統(tǒng)調(diào)用中的open函數(shù)。和open一樣,它返回文件的標(biāo)識(shí)符,只是這里叫做流(stream),在庫(kù)函數(shù)里實(shí)現(xiàn)為一個(gè)指向文件的指針。如果需要對(duì)設(shè)備的行為進(jìn)行明確的控制,最好使用底層系統(tǒng)調(diào)用,因?yàn)檫@可以避免使用庫(kù)函數(shù)帶來(lái)的一些非預(yù)期的副作用,如輸入/輸出緩沖。函數(shù)原型:#include<stdio.h>FILE *fopen(const char *filename, const char *mode)
16、;參數(shù)說(shuō)明:*filename:打開(kāi)文件的文件名*mode:打開(kāi)的方式 r 以只讀方式打開(kāi)文件,該文件必須存在。r+ 以可讀寫(xiě)方式打開(kāi)文件,該文件必須存在。rb+ 讀寫(xiě)打開(kāi)一個(gè)二進(jìn)制文件,允許讀數(shù)據(jù)。rw+ 讀寫(xiě)打開(kāi)一個(gè)文本文件,允許讀和寫(xiě)。w 打開(kāi)只寫(xiě)文件,若文件存在則文件長(zhǎng)度清為0,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件w+ 打開(kāi)可讀寫(xiě)文件,若文件存在則文件長(zhǎng)度清為零,即該文件內(nèi)容會(huì)消失。若文件不存在則建立該文件。fopen在成功是返回一個(gè)非空的FILE *指針。失敗返回NULL4.2 fread/fwrite函數(shù)fread函數(shù)從文件流中讀取數(shù)據(jù)
17、,對(duì)應(yīng)于系統(tǒng)調(diào)用中的read;fwrite函數(shù)從文件流中寫(xiě)數(shù)據(jù),對(duì)應(yīng)于系統(tǒng)調(diào)用中的write函數(shù)原型:#include<stdio.h>size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);參數(shù)說(shuō)明:*ptr 要讀取數(shù)據(jù)的緩沖區(qū),也就是要存放讀取數(shù)據(jù)的地方。size:指定每個(gè)數(shù)據(jù)記錄的長(zhǎng)度。nitems: 計(jì)數(shù),給出要傳輸?shù)挠涗泜€(gè)數(shù)。返回值:成功讀取到數(shù)據(jù)緩沖區(qū)的記錄個(gè)數(shù),當(dāng)?shù)竭_(dá)文件尾時(shí),他的返回值可能會(huì)消耗與nitems,甚至可以是0size_t fwrite(const coid *ptr, size_t size , size_t nitimes, FILE *stream);他從指定的數(shù)據(jù)緩沖區(qū)ptr中把數(shù)據(jù)寫(xiě)入文件流,返回成功寫(xiě)入的記錄個(gè)數(shù)。4.3 fclose函數(shù)fclose函數(shù)關(guān)閉指定的文件流stream,這個(gè)操作會(huì)使所有未寫(xiě)出的數(shù)據(jù)都寫(xiě)出。因?yàn)閟tdio庫(kù)函數(shù)會(huì)對(duì)數(shù)據(jù)進(jìn)行緩沖,所有調(diào)用fclose函數(shù)是很重要的。如果程序需要確保數(shù)據(jù)已經(jīng)全部寫(xiě)出,就應(yīng)該調(diào)用fclose函數(shù)。雖然程序正常結(jié)束時(shí),也會(huì)自動(dòng)的調(diào)用fclose函數(shù),但這樣就不能檢測(cè)出調(diào)用fclos
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 血管外科急危重癥診療要點(diǎn)
- 痔瘡嵌頓的護(hù)理
- 培訓(xùn)闖關(guān)游戲課件
- 中學(xué)行政培訓(xùn):提升管理智慧共筑教育合力
- 冬天保暖知識(shí)教育
- 康復(fù)科護(hù)理查房
- QC外出培訓(xùn)總結(jié)
- 全國(guó)教師教育發(fā)展大會(huì)實(shí)施綱要
- 養(yǎng)老機(jī)構(gòu)如何借助醫(yī)養(yǎng)結(jié)合模式實(shí)現(xiàn)2025年高質(zhì)量發(fā)展報(bào)告
- 航空貨運(yùn)行業(yè)2025年市場(chǎng)競(jìng)爭(zhēng)態(tài)勢(shì)與發(fā)展戰(zhàn)略規(guī)劃報(bào)告001
- 乒乓球體育課教案
- 竣工財(cái)務(wù)決算報(bào)表模板
- NB-T47003.1-2022常壓容器第1部分:鋼制焊接常壓容器
- 云南紅河州一中2025屆高一下數(shù)學(xué)期末綜合測(cè)試試題含解析
- 2024北京西城公安分局流管員招聘筆試參考題庫(kù)含答案解析
- 2021利達(dá)JB-QG-LD988EL JB-QT-LD988EL 火災(zāi)報(bào)警控制器 消防聯(lián)動(dòng)控制器調(diào)試手冊(cè)
- 浙二醫(yī)院護(hù)士進(jìn)修心得體會(huì)6篇
- 2024年中鐵(天津)軌道交通投資建設(shè)限公司運(yùn)營(yíng)管理人員招聘5人高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 2021年中國(guó)社會(huì)科學(xué)院大學(xué)統(tǒng)計(jì)學(xué)原理期末精練試卷
- 2024年《軍事理論》考試題庫(kù)附答案(含各題型)
- 廣東省中山市2022-2023學(xué)年高二下學(xué)期期末數(shù)學(xué)試題(學(xué)生版+解析)
評(píng)論
0/150
提交評(píng)論