1. linux系統呼叫及使用者程式設計介面(api)
2. linux中檔案及檔案描述符概述
使用系統呼叫函式時,多用man命令。如creat函式,進去把所需要的.h標頭檔案賦值貼上出來。確保標頭檔案的正確性。
man手冊中有下劃線的是函式引數,所以在檢視手冊時候可以尋找下劃線,找到後看具體引數描述。
在開啟或者建立乙個檔案時候,這時已經呼叫了核心函式,核心會給乙個返回值。稱其為檔案描述符,和使用者區中正常的函式返回值的概念理解起來有些不同。這是個索引值,相當於這個檔案,所以在這個檔案開啟的狀態下,如果後面還有函式要對這個檔案進行操作,就把這個索引值傳過去作為引數。當檔案關閉時這個索引值就就失去了效力,就是乙個普通的值。
3.不帶快取的(系統呼叫)-檔案訪問
errno是錯誤原因,是由系統巨集定義的。返回值是數字,每乙個數字對應乙個錯誤型別。輸出errno是錯誤型別對應的數字。(列印它需要標頭檔案errno.h
perror()將錯誤原因翻譯成字串,就是輸出errno對應的錯誤型別。括號中若填入內容也會列印出來,一般吧相應函式名填入,這樣在**量較大,呼叫函式較多時如果發生錯誤可以準確定位到具體的函式。
檔案開啟後,讀取或者寫入操作都有檔案指標輔助控制,每讀或者寫乙個,檔案指標就向後移動乙個,所以如果在呼叫了write函式後直接呼叫read函式讀取,是讀不出數的,因為write執行結束,檔案指標已經指向了檔案尾,這時再read是從檔案尾開始讀取,讀不到任何資訊。做法有兩種:1、關閉檔案,再開啟使用read函式就能讀取了,因為檔案關閉後檔案指標就自動回到檔案首部了。2、用lseek函式,調整檔案指標,即將檔案指標調整到檔案首部。
main函式引數使用 int main(int argc, char *ar**)
argc:向main函式傳遞的引數個數,實際要多乙個,因為還有加上main本身的執行函式,即./main。
ar**, 儲存命令列傳入的引數值
失敗返回-1
4.帶快取的(庫函式)- 檔案訪問
不帶快取的i/o對是檔案描述符操作,帶快取的i/o是針對流的。標準i/o庫就是帶快取的i/o,它由ansi c標準說明。不帶快取稱為檔案i/o。
在執行效率上來看,檔案i/o低於標準i/o。檔案i/o是通過系統呼叫使用核心函式直接對磁碟進行操作,屬於跨介質操作,會增加系統的開銷。標準i/o也會進行跨介質操作,但是有乙個快取區,先讀寫快取區,再訪問實際磁碟檔案,這樣就減少了跨介質操作的次數,效率就有所提高。
從通用性上看,檔案i/o是呼叫作業系統核心函式對磁碟操作,所以只有在linux作業系統中才能完成,可移植性較差。標準i/o是乙個標準函式包和stdio.h標頭檔案中的定義,具有一定的可移植性。即只要有函式包和標頭檔案就能在任意作業系統上執行了。
標準i/o提供快取的目的就是減少呼叫read和write的次數,它對每個i/o流自動進行快取管理(標準i/o函式通常呼叫malloc來分配快取)。它提供了三種型別的快取:
關於快取,如printf,遇到換行就重新整理緩衝區,將緩衝區中的記錄輸出到螢幕。
int fclose(file * stream)
函式說明: fclose()用來關閉先前fopen()開啟的檔案。此動作會讓緩衝區內的資料寫入檔案中,並釋放系統所提供的檔案資源
返回值: 若關檔案動作成功則返回0,有錯誤發生時則返回eof並把錯誤**存到errno。
int fputc(int c,file * stream);
函式說明: fputc 會將引數c 轉為unsigned char 後寫入引數stream 指定的檔案中。
返回值: fputc()會返回寫入成功的字元,即引數c。
若返回eof則代表寫入失敗。
int fgetc(file * stream);
函式說明: fgetc()從引數stream所指的檔案中讀取乙個字元。若讀到檔案尾而無資料時便返回eof。
返回值: fgetc()會返回讀取到的字元,若返回eof則表示到了檔案尾。
int fputs(const char * s,file * stream);
函式說明: fputs()用來將引數s所指的字串寫入到引數stream所指的檔案內。
返回值: 若成功則返回寫出的字元個數,返回eof則表示有錯誤發生。
char * fgets(char * s,int size,file * stream);
函式說明: fgets()用來從引數stream所指的檔案內讀入字元並存到引數s所指的記憶體空間,直到出現換行字元、讀到檔案尾或是已讀了size-1個字元為止,最後會加上null作為字串結束。
返回值: fgets()若成功則返回s指標,返回null則表示有錯誤發生。
size_t fread(void * ptr,size_t size,
size_t nmemb, file * stream)
函式說明: fread()用來從檔案流中讀取資料。
引數:stream為已開啟的檔案指標,
ptr: 指向欲存放讀取進來的資料空間, 讀取的字元數以引數size*nmemb來決定。
返回值:返回實際讀取到的nmemb數目。
size_t fwrite(const void * ptr, size_t size, size_t nmemb, file * stream)
函式說明:fwrite()用來將資料寫入檔案流中。
引數: stream:為已開啟的檔案指標,
ptr: 指向欲寫入的資料位址,總共寫入的字元數以 引數size*nmemb來決定。
返回值: 返回實際寫入的nmemb數目。
long ftell(file * stream);
函式說明:ftell()用來取得檔案流目前的讀寫位置。
引數stream為已開啟的檔案指標。
返回值:當呼叫成功時則返回目前的讀寫位置,
若有錯誤則返回-1,errno會存放錯誤**。
錯誤**:ebadf 引數stream無效或可移動讀寫位置的檔案流。
int getc(file * stream);
函式說明: getc()用來從引數stream所指的檔案中讀取乙個字元。若讀到檔案尾而無資料時便返回eof。
注意: getc()與fgetc()作用相同,但getc()為巨集定義,非真正的函式呼叫。
返回值: getc()會返回讀取到的字元,若返回eof則表示到了檔案尾。
int putc(int c,file * stream);
函式說明:putc()會將引數c轉為unsigned char後寫入引數stream指定的檔案中。
注意: 雖然putc()與fputc()作用相同,但putc()為巨集定義,非真正的函式呼叫。
返回值:putc()會返回寫入成功的字元,即引數c。
若返回eof則代表寫入失敗。
int fprintf(file * stream, const char * format,…);
函式說明:fprintf()會根據引數format字串來轉換並格式化資料,然後將結果輸出到引數stream指定的檔案中,直到出現字串結束(『\0』)為止。
返回值:成功則返回實際輸出的字元數,失敗則返回-1,錯誤原因存於errno中。
int fscanf(file * stream ,const char *format,…)
函式說明: fscanf()會自引數stream的檔案流中讀取字串,再根據引數format字串來轉換並格式化資料。
返回值:成功則返回引數數目,失敗則返回-1,錯誤原因存於errno中。
int feof(file * stream);
函式說明: feof()用來偵測是否讀取到了檔案尾,引數stream為fopen()所返回之檔案指標。如果已到檔案尾則返回非零值,其他情況返回0。
返回值: 返回非零值代表已到達檔案尾。
Linux檔案程式設計
在linux下可以通過相應的檔案i o函式來完成對檔案的操作,這些函式通常被稱為不帶緩衝的i o,因為這些函式對檔案的讀寫都是呼叫linux核心的系統呼叫來實現的。基本的函式包括 open read write lseek 設定檔案指標 close等 呼叫格式 include include inc...
Linux檔案程式設計
linux中檔案程式設計可以使用兩種方法 1.linux系統呼叫 2.c語言庫函式。系統呼叫是基於linux系統的,它不能跨系統使用。c語言庫函式在各個系統都能使用。a.下面先介紹基於系統呼叫的檔案程式設計 1.檔案的建立.int creat const char filename,mode t m...
Linux檔案程式設計
所謂系統呼叫是指作業系統提供給使用者的一組 特殊 介面,使用者程式可以通過這組 特殊 介面來獲得作業系統核心提供的的服務 由於在linux中,為了更好地保護核心空間,將程式的執行空間分為核心空間和使用者空間 也就是常稱的核心態和使用者態 它們分別執行在不同的級別上,在邏輯上是相互隔離的。因此,使用者...