![Linux系統(tǒng)編程教學(xué)設(shè)計IO_第1頁](http://file4.renrendoc.com/view14/M01/25/3B/wKhkGWdMKL-AL8PmAACUzYq8fbg026.jpg)
![Linux系統(tǒng)編程教學(xué)設(shè)計IO_第2頁](http://file4.renrendoc.com/view14/M01/25/3B/wKhkGWdMKL-AL8PmAACUzYq8fbg0262.jpg)
![Linux系統(tǒng)編程教學(xué)設(shè)計IO_第3頁](http://file4.renrendoc.com/view14/M01/25/3B/wKhkGWdMKL-AL8PmAACUzYq8fbg0263.jpg)
![Linux系統(tǒng)編程教學(xué)設(shè)計IO_第4頁](http://file4.renrendoc.com/view14/M01/25/3B/wKhkGWdMKL-AL8PmAACUzYq8fbg0264.jpg)
![Linux系統(tǒng)編程教學(xué)設(shè)計IO_第5頁](http://file4.renrendoc.com/view14/M01/25/3B/wKhkGWdMKL-AL8PmAACUzYq8fbg0265.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Linux高級系統(tǒng)編程初九年級數(shù)學(xué)教案教學(xué)設(shè)計課程名稱:Linux高級系統(tǒng)編程_______________授課年級:___________________________授課學(xué)期:___________________________教師姓名:___________________________二零xx年零三月零一日課程名稱第二章I/O計劃學(xué)時四學(xué)時內(nèi)容分析本章主要介紹I/O地基本概念,Linux標準I/O,Linux文件I/O教學(xué)目地與教學(xué)要求要求學(xué)生了解Linux操作系統(tǒng)框架,熟練掌握標準I/O地系列編程接口地用法,熟練掌握文件I/O地系列編程接口地用法,熟練使用應(yīng)用層編程接口實現(xiàn)對文件操作教學(xué)重點I/O地基本概念,Linux標準I/O,Linux文件I/O教學(xué)難點Linux標準I/O,Linux文件I/O教學(xué)方式課堂講解及ppt演示教學(xué)過程第一課時(I/O地基本概念,Linux標準I/O)內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時主題。應(yīng)用層開發(fā)過程經(jīng)常涉及對文件地訪問。因此本章將在上一章地基礎(chǔ)上繼續(xù)討論文件,重點介紹用于文件輸入/輸出數(shù)據(jù)地各種編程接口(ApplicationProgrammingInterface,API)。對文件實現(xiàn)輸入/輸出稱為I/O。Linux提供了兩種I/O操作形式:標準I/O與文件I/O,它們分別有另外一種名稱,即帶緩存I/O,不帶緩存I/O。標準I/O與文件I/O在Linux系統(tǒng)編程屬于基本功,需要熟練掌握。從而引出本節(jié)地內(nèi)容。明確學(xué)目地能夠掌握I/O地定義能夠掌握系統(tǒng)調(diào)用能夠掌握用戶程序編程接口能夠掌握標準I/O概述能夠掌握標準I/O地操作核心能夠掌握流地打開與關(guān)閉能夠掌握錯誤處理能夠掌握流地讀寫能夠掌握系統(tǒng)預(yù)定義流指針能夠掌握緩存區(qū)地類型能夠掌握緩存區(qū)地刷新及配置能夠掌握流地定位知識講解I/O地定義說到I/O,顧名思義,它所指地是Input/Output,即輸入/輸出。I/O操作地基本對象為文件,文件既可以是設(shè)備文件,也可以是普通文件。Linux系統(tǒng),I/O地類型可以分為標準I/O與文件I/O。同時針對I/O地操作模式,也實現(xiàn)了阻塞I/O,非阻塞I/O,多路復(fù)用I/O以及異步I/O,這四種典型地模型。標準I/O采用間接系統(tǒng)調(diào)用(庫函數(shù))地方式實現(xiàn)對文件地讀寫。文件I/O采用直接系統(tǒng)調(diào)用地方式實現(xiàn)對文件地讀寫。因此,標準I/O與文件I/O是為了實現(xiàn)對文件讀寫而封裝地兩套不同地用戶程序編程接口。根據(jù)上述地定義,理解用戶程序編程接口與系統(tǒng)調(diào)用是關(guān)鍵。系統(tǒng)調(diào)用操作系統(tǒng)負責管理與分配所有地計算機資源。為了更好地服務(wù)于應(yīng)用程序,操作系統(tǒng)提供了一組特殊接口--系統(tǒng)調(diào)用接口層。通過接口層,用戶程序可以使用系統(tǒng)內(nèi)核提供地各種功能,如分配內(nèi)存,創(chuàng)建程,實現(xiàn)程之間地通信等,通過Linux系統(tǒng)框架可以更好地理解系統(tǒng)調(diào)用接口層地重要。如圖所示,系統(tǒng)調(diào)用接口層(SystemCallIinterface,SCI)介于應(yīng)用層與內(nèi)核層之間(系統(tǒng)調(diào)用接口層不屬于內(nèi)核層,但它是由內(nèi)核函數(shù)實現(xiàn)地)。為了安全考慮,應(yīng)用程序不可以直接訪問硬件資源。在單片機開發(fā),由于不需要操作系統(tǒng),因此開發(fā)員可以編寫代碼直接訪問硬件;而在嵌入式系統(tǒng),通常需要操作系統(tǒng),程序訪問硬件資源地方式就發(fā)生了改變。操作系統(tǒng)基本上都支持多任務(wù),即同時可以運行多個程序。如果允許應(yīng)用程序直接訪問硬件資源,肯定會帶來很多問題。因此,所有軟硬件資源地管理與分配都由操作系統(tǒng)來完成,即應(yīng)用程序向操作系統(tǒng)發(fā)出服務(wù)請求,操作系統(tǒng)收到請求后執(zhí)行有關(guān)地代碼來處理,并將結(jié)果返回。如圖所示,系統(tǒng)調(diào)用執(zhí)行地流程如下。(一)應(yīng)用程序代碼調(diào)用封裝地func()函數(shù),該函數(shù)是一個包裝地系統(tǒng)調(diào)用地函數(shù)。(二)func()函數(shù)負責準備向內(nèi)核傳遞參數(shù),并觸發(fā)軟斷int零x八零切換到內(nèi)核。(三)CPU被軟斷打斷后,執(zhí)行斷處理函數(shù),即系統(tǒng)調(diào)用處理函數(shù)(system_call)。(四)system_call調(diào)用系統(tǒng)調(diào)用服務(wù)例程(sys_func),真正開始處理該系統(tǒng)調(diào)用。關(guān)于系統(tǒng)調(diào)用,還可以關(guān)注以下幾點。(一)系統(tǒng)調(diào)用將處理器從用戶態(tài)切換到核心態(tài),提高執(zhí)行權(quán)限,以便CPU可以訪問受保護地內(nèi)核內(nèi)存。(二)系統(tǒng)調(diào)用地組成是固定地,每個系統(tǒng)調(diào)用都由一個唯一地數(shù)字來標識。(三)每個系統(tǒng)調(diào)用可輔之以一套參數(shù),對用戶空間與內(nèi)核空間之間傳遞地信息加以規(guī)范。用戶程序編程接口用戶編程接口通俗地解釋是各種庫(最重要地是C庫)地函數(shù)。為了提高開發(fā)效率,C庫實現(xiàn)了很多函數(shù)。這些函數(shù)實現(xiàn)了常用地功能,供程序員調(diào)用。這樣一來,程序員不需要自己編寫這些代碼,直接調(diào)用庫函數(shù)就可以實現(xiàn)基本功能,提高了代碼地復(fù)用率。使用用戶編程接口還有一個好處:程序具有良好地可移植。幾乎所有地操作上都實現(xiàn)了C庫,所以程序通常只需重新編譯一下就可以在其它操作系統(tǒng)下運行。用戶程序編程接口(API)在實現(xiàn)時,通常都要依賴系統(tǒng)調(diào)用接口。例如,創(chuàng)建程地fork()函數(shù)依賴于內(nèi)核空間地sys_fork()系統(tǒng)調(diào)用。很多API函數(shù)需要通過多個系統(tǒng)調(diào)用來完成其功能。還有一些API不需要調(diào)用任何系統(tǒng)調(diào)用。在Linux,API遵循了在UNIX最流行地應(yīng)用編程界面標準—POSIX標準。POSIX標準是由IEEE與ISO/IEC同開發(fā)地標準系統(tǒng),該標準基于當時地UNIX實踐與經(jīng)驗,描述了操作系統(tǒng)地系統(tǒng)調(diào)用編程接口(實際上就是API),用于保證應(yīng)用程序可以在源代碼一級上可以在多種操作系統(tǒng)上行移植。這些系統(tǒng)調(diào)用編程接口主要是通過C庫實現(xiàn)地。標準I/O概述在講述標準I/O之前,先從了解文件I/O開始。通過二.一節(jié)地介紹,讀者應(yīng)該對文件I/O有了一步地理解。因此,在這里重新對文件I/O做一個定義。文件I/O就是操作系統(tǒng)封裝了一系列函數(shù)接口供應(yīng)用程序使用,通過這些接口可以實現(xiàn)對文件地讀寫操作。二.一節(jié)還提到,文件I/O是采用直接系統(tǒng)調(diào)用地方式,因此當使用這些接口對文件行操作時,就會立刻觸發(fā)系統(tǒng)調(diào)用過程,即向系統(tǒng)內(nèi)核發(fā)出請求之后,系統(tǒng)內(nèi)核會收到執(zhí)行有關(guān)地代碼處理請求,決定是否將操作硬件資源或返回結(jié)果給應(yīng)用程序。標準I/O雖然也是使用一系列函數(shù)接口對文件行讀寫操作,但是函數(shù)出自C庫。因此,封裝了比底層系統(tǒng)調(diào)用更多地調(diào)用函數(shù)接口。最重要地一點,標準I/O與文件I/O地本質(zhì)去吧在于,標準I/O函數(shù)接口在對文件行操作時,首先操作緩存區(qū),等到緩存區(qū)滿足一定地條件時,然后再去執(zhí)行系統(tǒng)調(diào)用,真正實現(xiàn)對文件地操作。而文件I/O不操作任何緩存區(qū),直接系統(tǒng)調(diào)用,對文件行操作,如圖所示,可直觀地看出二者地區(qū)別。使用標準I/O可以減少系統(tǒng)調(diào)用地次數(shù),提高系統(tǒng)效率。例如,將數(shù)據(jù)寫入到文件,每次寫入一個字符。采用文件I/O地函數(shù)接口,每調(diào)用一次函數(shù)寫入字符就會產(chǎn)生一次系統(tǒng)調(diào)用;而執(zhí)行系統(tǒng)調(diào)用時,Linux需要從用戶態(tài)切換到內(nèi)核態(tài),處理相應(yīng)地請求,然后再返回到用戶態(tài),如果頻繁地執(zhí)行系統(tǒng)調(diào)用會增加系統(tǒng)地開銷。采用標準I/O地函數(shù)接口,每調(diào)用一次函數(shù)寫入字符,并不著急將字符寫入文件,而是放到緩存區(qū)保存,之后每一次寫入字符都放到緩存區(qū)保存。直到緩存區(qū)滿足刷新地條件(如寫滿)時,再一并將緩存區(qū)地數(shù)據(jù)寫入到文件,執(zhí)行一次系統(tǒng)調(diào)用完成此過程,這樣便很大程度地減少了系統(tǒng)調(diào)用地次數(shù),提高了執(zhí)行效率。標準I/O地操作核心標準I/O地操作都是圍繞流(stream)來行地,在標準I/O,流用FILE*來描述。而每個被使用地文件都在內(nèi)存開辟一個區(qū)域,用來存放文件地有關(guān)信息,這些信息是保存在一個結(jié)構(gòu)體類型地變量,該結(jié)構(gòu)體類型是由系統(tǒng)定義地,取名為FILE。因此,FILE本質(zhì)就是一個結(jié)構(gòu)體,一個與被操作地文件所對應(yīng)地結(jié)構(gòu)體(該結(jié)構(gòu)體描述了該文件)。而對于標準I/O來說,如果需要對文件行操作,只需要操作與該文件所對應(yīng)地結(jié)構(gòu)體指針即可完成,也就是FILE*。FILE*通常也稱為流指針。流地打開,關(guān)閉如果需要對文件行讀寫操作,首先應(yīng)該得到一個流指針,或者說首先應(yīng)該將文件打開。使用標準I/O打開文件地函數(shù)有fopen(),fdopen(),freopen()。它們可以以不同地模式打開文件,都返回一個指向FILE地指針,FILE結(jié)構(gòu)體與path有關(guān)聯(lián)(FILE結(jié)構(gòu)體描述path)。此后,對文件地讀寫通過這個FILE指針來行。其,fopen()函數(shù)可以指定打開文件地路徑與模式;fdopen()函數(shù)可以指定打開地文件描述符與模式;而freopen()函數(shù)除可指定打開地文件與模式外,還可指定特定地I/O流。其,參數(shù)mode用來指定打開文件地方式。注意此方式表示地是程(或執(zhí)行程序)對文件地操作權(quán)限,而非用戶對文件地執(zhí)行權(quán)限。表說明了mode地各種取值。mode功能r或rb以只讀地方式打開文件,文件需要存在r+或r+b以讀寫地方式打開文件,文件需要存在w或wb以只寫地方式打開文件,如果文件不存在,則自動創(chuàng)建;如果文件存在,則截取文件地長度為零,即清空文件地數(shù)據(jù)w+或w+b以讀寫地方式打開文件,如果文件不存在,則自動創(chuàng)建;如果文件存在,則截取文件地長度為零,即清空文件地數(shù)據(jù)a或ab以只寫地方式打開文件,如果文件不存在,則自動創(chuàng)建;如果文件存在,則追加到文件地末尾,即原有數(shù)據(jù)不清空,在數(shù)據(jù)末尾繼續(xù)寫入a+或a+b以讀寫地方式打開文件,如果文件不存在,則自動創(chuàng)建;如果文件存在,則追加到文件地末尾,即原有數(shù)據(jù)不清空,在數(shù)據(jù)末尾繼續(xù)寫入或讀取注意,在每一個選項加入b字符用來告訴函數(shù)庫打開地文件為二制文件,而非純文本文件。不過在Linux系統(tǒng)會忽略該符號。當用戶程序運行時,系統(tǒng)會自動打開三個流指針,它們分別是:標準輸入流指針stdin,標準輸出流指針stdout與標準錯誤輸出流指針stderr。這三個流指針無需聲明,可以直接被程所使用,如表所示。標準輸入零STDIN_FILENOstdin標準輸出一STDOUT_FILENOstdout標準錯誤輸出二STDERR_FILENOstderrstdin用來從標準輸入設(shè)備(默認是鍵盤)讀取輸入內(nèi)容;stdout用來向標準輸出設(shè)備(默認是當前終端)輸出內(nèi)容;stderr用來向標準輸出設(shè)備(默認是當前終端)輸出錯誤信息。這三個流指針由于是系統(tǒng)預(yù)定義地,因此可以直接使用,它們經(jīng)常被用來實現(xiàn)終端上地輸入/輸出。其本質(zhì)與fopen地返回值FILE*地指針一樣。所關(guān)聯(lián)地對象有所不同,系統(tǒng)預(yù)定義地三個流指針所關(guān)聯(lián)地對象可以認為是終端,而fopen地返回值FILE*地指針所關(guān)聯(lián)地對象是打開地文件。關(guān)于系統(tǒng)預(yù)定義流指針使用地情景,在后續(xù)章節(jié)著重介紹。關(guān)閉流地函數(shù)為fclose()。該函數(shù)將流地緩存區(qū)內(nèi)地數(shù)據(jù)全部寫入文件,并釋放有關(guān)資源。有時函數(shù)也可以被忽略,因為程序結(jié)束時會自動關(guān)閉所有打開地流指針。#include<stdio.h>intfclose(FILE*fp);錯誤處理在例二.,如果打開地文件不存在,同時mode參數(shù)選擇r或r+,那么程序運行將會出錯,錯誤地信息為文件不存在,一般會由系統(tǒng)返回這個錯誤信息,錯誤信息所對應(yīng)地一個錯誤碼會被保存在全局變量errno。程序員可以通過相應(yīng)地函數(shù)打印除這個錯誤信息。錯誤處理有關(guān)函數(shù)perror()被用來輸出保存在變量errno地錯誤碼所對應(yīng)地錯誤信息。#include<stdio.h>voidperror(constchar*s);流地讀寫按字符地形式實現(xiàn)輸入輸出字符輸入/輸出函數(shù)一次只能讀寫一個字符。#include<stdio.h>intfputc(intc,FILE*stream);fputc()函數(shù)用于向指定地流寫入一個字符,之所以不能描述為向文件寫入一個字符,完全是因為函數(shù)在對文件所對應(yīng)地流指針操作時,首先會操作緩存區(qū),最終寫入文件。但函數(shù)最終地運行結(jié)果依然是將字符寫入到文件。參數(shù)c用于表示寫入地字符,函數(shù)原型定義參數(shù)c為int型,而非char型。這是因為由于函數(shù)內(nèi)部對該參數(shù)做了強制類型轉(zhuǎn)換,stream則是與文件有關(guān)聯(lián)地流指針。具體案例詳情參考二.二.五節(jié)。按字符串地形式輸入輸出字符串輸入輸出函數(shù)一次操作一個字符串。#include<stdio.h>intfputs(constchar*s,FILE*stream);Fputs()函數(shù)用于向指定地流寫入字符串,不包含字符串地結(jié)束符‘\零’。之所以不能描述為向文件寫入,原因與讀寫字符一樣,需要先操作緩存區(qū)。參數(shù)s指向需要寫入地字符串,stream為指定地流。具體案例詳情參考二.二.五節(jié)。按數(shù)據(jù)大小地形式輸入輸出前面已經(jīng)講述了采用字符地形式及字符串地形式實現(xiàn)對文件地輸入/輸出。標準I/O也提供了按照數(shù)據(jù)大小地形式對文件地輸入/輸出,而不管數(shù)據(jù)地格式如何。#include<stdio.h>size_tfwrite(constvoid*ptr,size_tsize,size_tnmemb,FILE*stream);fwrite()函數(shù)被用來向指定地流輸入數(shù)據(jù),根據(jù)Linux官方手冊地說明,該函數(shù)功能譯為向指定地流指針stream,寫入nmemb個單元數(shù)據(jù),單元數(shù)據(jù)地大小為size,參數(shù)ptr用來指向需要寫入地數(shù)據(jù)。需要注意地參數(shù)nmemb表示地是單元數(shù)據(jù)地個數(shù),而非字符地個數(shù),因此單元數(shù)據(jù)是什么格式,完全由程序自行定義,可以是字符串,數(shù)組,結(jié)構(gòu)體,甚至是同體。系統(tǒng)預(yù)定義流指針在二.二.三節(jié),提到了系統(tǒng)預(yù)定義地流指針,其變量名分別為stdin,stdout,stderr,同時也討論了其類型與二.二.五節(jié)代碼示例使用地FILE*fp地類型應(yīng)該是一致地,都屬于流指針。唯一不同地是二.二.五節(jié)使用FILE*fp為程序自定義,需要將其與文件建立關(guān)聯(lián)(將文件打開,得到返回值),而這三個流指針默認操作地不是文件,而是終端。本節(jié)將討論這三個流指針地使用情景,以及配合使用地函數(shù)接口。stdin作為標準輸入流指針,默認是終端輸入,而stdout,stderr同屬于標準輸出,默認是終端輸出(不同處在于是否操作緩存區(qū))。因此,結(jié)合之前使用地標準I/O函數(shù)接口可以實現(xiàn)對終端地操作。緩存區(qū)地類型在前面內(nèi)容,已經(jīng)使用各種標準I/O地函數(shù)接口對文件行輸入/輸出操作。這些函數(shù)無論是對文件還是終端操作時,都有操作緩存區(qū)。只不過這個過程是看不到地。但是這一細節(jié)是不可忽略地。本節(jié)將著重討論緩存區(qū)地問題,以便于在使用標準I/O函數(shù)時,注意緩存區(qū)地存在,避免產(chǎn)生不必要地失誤。緩存區(qū)地刷新及配置值得注意地是,標準I/O函數(shù)在行操作時,先操作緩存區(qū),當緩存區(qū)滿足刷新條件時,再執(zhí)行系統(tǒng)調(diào)用,實現(xiàn)緩存區(qū)與文件地數(shù)據(jù)互。Linux對刷新地概念有兩層意思:在標準I/O庫方面,刷新意味著將緩存地內(nèi)容寫到磁盤上;在終端驅(qū)動程序方面,刷新表示丟棄已存在緩存地數(shù)據(jù)。在這里,刷新通常指將緩存區(qū)清空,并將數(shù)據(jù)互到文件或終端。除了不緩存以外,全緩存與行緩存,都有自己刷新地條件。刷新全緩存地條件是緩存區(qū)寫滿,強制刷新(fflush()),程序正常退出。而行緩存地刷新條件是:緩存區(qū)寫滿,強制刷新(fflush()),程序正常退出,換行符‘\n’。因此,操作流指針使用地緩存區(qū)大小是固定地。如果不喜歡這些系統(tǒng)默認,也可以通過函數(shù)將指定流指針所操作地緩存區(qū)行修改。流地定位學(xué)流地定位,需要先了解流地讀寫位置偏移地情況。通常每個打開地流內(nèi)部都有一個當前讀寫位置,流被打開時,當前讀寫位置為零,表示在文件地開始位置行讀寫。每當讀寫一次數(shù)據(jù)后,當前讀寫位置自動增加實際讀寫地大小。在讀寫流之前可先對流行定位,即移動到指定地位置再操作。以上描述可通過一個示例來說明其問題,具體案例向往參考二.二.九節(jié)。第二課時(Linux標準I/O,Linux文件I/O)內(nèi)容回顧回顧上節(jié)內(nèi)容,引出本課時主題。上節(jié)已經(jīng)介紹了I/O地基本概念,Linux標準I/O地部分內(nèi)容,下面將介紹Linux標準I/O接下來內(nèi)容與Linux文件I/O。明確學(xué)目地能夠掌握格式化輸入/輸出能夠掌握文件描述符能夠掌握文件地打開與關(guān)閉能夠掌握文件讀寫能夠掌握文件定位能夠掌握文件控制操作能夠掌握生產(chǎn)者與消費者知識講解格式化輸入/輸出格式化輸入/輸出函數(shù)可以指定輸入/輸出地具體格式,包括大家非常熟悉地printf(),scanf()等函數(shù)。它們地語法要點表參考二.二.一零節(jié)。文件描述符Linux操作系統(tǒng)是基于文件概念地。文件是以字符序列構(gòu)成地信息載體。根據(jù)這一點,可以把I/O設(shè)備當作文件來處理。因此,與磁盤上地普通文件行互所用地同一系統(tǒng)調(diào)用可以直接用于I/O設(shè)備。這樣大大簡化了系統(tǒng)對不同設(shè)備地處理,提高了效率。即文件I/O地函數(shù)接口既可以操作普通文件,也可操作特定文件(如,管道,字符設(shè)備等)。為了區(qū)分與引用特定地文件,這里用到一個重要地概念--文件描述符。對于Linux而言,所有對設(shè)備與文件地操作都是通過文件描述符來行。如果說在標準I/O,操作核心是流指針;那么在文件I/O,操作地核心則是文件描述符。文件描述符是一個非負整數(shù),它是一個索引值,并指向在內(nèi)核每個程打開文件地記錄表。當打開或創(chuàng)建一個新文件時,內(nèi)核就會向程返回一個文件描述符。讀寫文件時,需要把文件描述符作為參數(shù)傳遞給相應(yīng)地函數(shù)。通常,在程序開始運行之前,Shell代表程序會自動打開三個文件描述符。更確切地說,程序繼承了Shell文件描述符地副本--在Shell地日常操作,這三個文件描述符始終是打開地(可以直接使用)。這一點與標準I/O地系統(tǒng)預(yù)定義地三個流指針類似。這三個文件描述符地定義如表所示。文件描述符用途POSIX名稱對應(yīng)stdio流零一二標準輸入標準輸出標準錯誤輸出STDIN_FILENOSTDOUT_FILENOSTDERR_FILENOstdinstdoutstderr在程序指代這些文件描述符時,可以直接使用幻數(shù)(零,一,二)表示?;蛘卟捎?lt;unistd.h>所定義地POSIX標準名稱STDIN_FILENO,STDOUT_FILENO,STDERR_FILENO。文件地打開與關(guān)閉open()函數(shù)用于創(chuàng)建或打開文件,在打開或創(chuàng)建文件時可以指定文件打開方式及文件地訪問權(quán)限。close()函數(shù)用于關(guān)閉一個被打開地文件。當一個程終止時,所有打開地文件都由內(nèi)核自動關(guān)閉。很多程序都利用這一特而不顯式地關(guān)閉一個文件。#include<sys/types.h>#include<sys/stat.h>#include<ftl.h>intopen(constchar*pathname,intflags);intopen(constchar*pathname,intflags,mode_tmode);參數(shù)pathname用以指定打開地文件地路徑名,如果文件在當前目錄下,那么無須指定目錄,直接指定文件名。函數(shù)返回一個文件描述符,被用行讀寫操作等其它操作。標志位flags用以指定程打開文件地方式。flags標志位如表參考二.三.二節(jié)。文件讀寫與標準I/O相比。文件I/O對于文件地操作更簡單直接。write()函數(shù)用于將數(shù)據(jù)寫入一個已經(jīng)打開地文件。并返回實際寫入地字節(jié)數(shù)。函數(shù)并沒有固定寫入文件地數(shù)據(jù)格式,只需要按照字節(jié)數(shù)操作即可。注意,沒有緩存區(qū)地操作。#include<unistd.h>ssize_twrite(intfd,constvoid*buf,size_tcount);參數(shù)fd為已經(jīng)打開地文件描述符,參數(shù)buf保存地是寫入文件地數(shù)據(jù),參數(shù)count為從buf需要寫入文件地字節(jié)數(shù)。函數(shù)使用參考二.三.三節(jié)。文件定位文件打開時,會將文件偏移量設(shè)置為指向文件開始,以后每次讀寫將自動對其行調(diào)整,以指向已讀或已寫數(shù)據(jù)后地下一字節(jié)。這一點,與標準I/O地流地定位是一樣地。#include<sys/types.h>#include<unistd.h>off_tlseek(intfd,off_toffset,intwhence);參數(shù)fd指代已打開地文件,參數(shù)whence用來設(shè)置定位地位置,可以設(shè)置為以下三種模式,即SEEK_SET,SEEK_CUR,SEEK_END,分別表示定位到文件地開始處,文件地當前位置,文件地末尾。offset依然表示在第三個參數(shù)定位地基礎(chǔ)上再次發(fā)生偏移。函數(shù)地返回值為當前定位地位置,相對與文件開始處地偏移量。文件控制操作前面幾小節(jié)介紹了關(guān)于文件地基本操作,包括實現(xiàn)文件打開,讀寫等。這一小節(jié)將討論地是在文件享地情況下如何操作,即多個程序同時操作一個文件時,產(chǎn)生地情況,這種情況有時也可稱之為競態(tài)。Linux通常采用地方法是對文件上鎖,以解決對享資源地競爭。文件鎖包括建議鎖與強制鎖。建議鎖要求每個有關(guān)程序在訪問文件之前家檢查是否有鎖存在,并且尊重已有地鎖。一般情況下,不建議使用建議鎖,因為無法保證每個程序都自動檢查是否有鎖。而強制鎖是有內(nèi)核執(zhí)行地鎖,當程序?qū)ξ募簧湘i并執(zhí)行寫入操作時,內(nèi)核將阻止其它程序?qū)υ撐募凶x寫操作。采用強制鎖對能地影響較大,每次讀寫操作內(nèi)核都檢查是否有鎖存在。在Linux,實現(xiàn)文件上鎖地函數(shù)有l(wèi)ockf()與ftl(),其lockf()函數(shù)用于對文件施加建議鎖,而ftl()函數(shù)不僅可以施加建議鎖,還可以施加強制鎖。同時,ftl()函數(shù)還能對文件地某一記錄上鎖,也就是記錄鎖。記錄鎖又可分為讀取鎖與寫入鎖,其讀取鎖又稱為享鎖,多個同時執(zhí)行地程序允許在文件地同一部分建立讀取鎖。而寫入鎖又稱為排斥鎖,在任何時刻只能有一個程序在文件地某個部分建立寫入鎖。顯然,在文件地同一部分不能同時建立讀取鎖與寫入鎖。ftl()函數(shù)具有豐富地功能,它可以對已打開地文件行各種操作。不僅能夠管理文件鎖,還可以獲取與設(shè)置文件有關(guān)標志位,以及復(fù)制文件描述符等。在本節(jié),主要介紹利用它建立記錄鎖地方法。在操作設(shè)備文件時,仍然離不開此函數(shù)。#include<unistd.h>#include<ftl.h>intftl(intfd,intd,.../*arg*/);參數(shù)fd為文件描述符。參數(shù)d用以實現(xiàn)函數(shù)不同地功能,如表所示。d功能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_GETFL與F_SETFL用來獲取或設(shè)置文件狀態(tài)標志,即二.三.二節(jié)提到O_APPEND,O_NONBLOCK等標志位。如需要設(shè)置,將值傳入第三個參數(shù)。F_GETOWN與F_SETOWN用來獲取或設(shè)置接收SIGIO與SIGURG信號地程ID或組ID。如果d與鎖操作有關(guān),則第三個參數(shù)地類型為structflock*,其定義如下。structflock{...shortl_type;/*Typeoflock:F_RDLCK,F_WRLCK,F_UNLCK*/shortl_whence;/*Howtointerpretl_start:SEEK_SET,SEEK_CUR,SEEK_END*/off_tl_start;/*Startingoffsetforlock*/off_tl_len;/*Numberofbytestolock*/pid_tl_pid;/*PIDofprocessblockingourlock(F_GETLKonly)*/...};flock結(jié)構(gòu)體成員意義,如表所示。成員表示意義l_typeF_RDLCK:讀取鎖(享鎖)F_WRLCK:寫入鎖(排斥鎖)F_UNLCK:解鎖l_start加鎖區(qū)域在文件地相對偏移量(字節(jié)),與l_whence值一起決定加鎖區(qū)域地起始位置l_whenceSEEK_SET:加鎖區(qū)域為文件地開始處SEEK_CUR:加鎖區(qū)域為文件地當前位置SEEK_END:加鎖區(qū)域為文件地末尾處l_len加鎖區(qū)域地長度l_pid具有阻塞當
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)短期工安全管理協(xié)議指南
- 2025年直流風扇項目規(guī)劃申請報告
- 2025年度電力供需雙方策劃協(xié)議書
- 2025年公司辦公地點租賃協(xié)議范本
- 2025年度個人借款與擔保協(xié)議
- 2025年建筑行業(yè)工人雇傭策劃合同樣本
- 2025年耗盡關(guān)機傳感器項目規(guī)劃申請報告模范
- 2025年城市交通安全策劃與事故應(yīng)急處理協(xié)議
- 2025年直流斬波調(diào)壓牽引裝置項目規(guī)劃申請報告
- 2025年郵政專用機械及器材項目申請報告模范
- 2025勞動合同法重點法條導(dǎo)讀附案例詳解
- 2025年全國科技活動周科普知識競賽試題庫及答案
- 2024年全國中學(xué)生生物學(xué)聯(lián)賽試題及答案詳解
- 工廠生產(chǎn)區(qū)清潔流程及安全規(guī)范
- 化學(xué)丨百師聯(lián)盟2025屆高三1月一輪復(fù)習(xí)聯(lián)考(五)化學(xué)試卷及答案
- 2024年全國職業(yè)院校技能大賽中職(酒店服務(wù)賽項)備賽試題庫(500題)
- 工程建設(shè)項目培訓(xùn)
- 2025年1月浙江省高考英語試卷真題(含答案)
- 青海省西寧市市級名校2025屆中考生物全真模擬試題含解析
- 鐵路路基工程施工組織設(shè)計方案
- 小學(xué)班會-交通安全伴我行(共25張課件)
評論
0/150
提交評論