Linux下對(duì)文件操作有兩種方式:系統(tǒng)調(diào)用(system call)和庫函數(shù)調(diào)用(Library
functions)。可以參考《Linux程序設(shè)計(jì)》(英文原版為《Beginning Linux Programming》,作者是Neil
Matthew和Richard Stones)第三章: Working with files。
1。系統(tǒng)調(diào)用
系統(tǒng)調(diào)用提供的函數(shù)如open, close, read, write,
ioctl等,需包含頭文件unistd.h。以write為例:其函數(shù)原型為 size_t write(int fd, const void
*buf, size_t nbytes),其操作對(duì)象為文件描述符或文件句柄fd(file
descriptor),要想寫一個(gè)文件,必須先以可寫權(quán)限用open系統(tǒng)調(diào)用打開一個(gè)文件,獲得所打開文件的fd,例如
fd=open(\"/dev/video\",
O_RDWR)。fd是一個(gè)整型值,每新打開一個(gè)文件,所獲得的fd為當(dāng)前最大fd加1。Linux系統(tǒng)默認(rèn)分配了3個(gè)文件描述符
值:0-standard input,1-standard output,2-standard error。
系統(tǒng)調(diào)用通常用于底層文件訪問(low-level file access),例如在驅(qū)動(dòng)程序中對(duì)設(shè)備文件的直接訪問。
系統(tǒng)調(diào)用是操作系統(tǒng)相關(guān)的,因此一般沒有跨操作系統(tǒng)的可移植性。
系統(tǒng)調(diào)用發(fā)生在內(nèi)核空間,因此如果在用戶空間的一般應(yīng)用程序中使用系統(tǒng)調(diào)用來進(jìn)行文件操作,會(huì)有用戶空間到內(nèi)核空間切換的開銷。事實(shí)上,即使在用戶空間使
用庫函數(shù)來對(duì)文件進(jìn)行操作,因?yàn)槲募偸谴嬖谟诖鎯?chǔ)介質(zhì)上,因此不管是讀寫操作,都是對(duì)硬件(存儲(chǔ)器)的操作,都必然會(huì)引起系統(tǒng)調(diào)用。也就是說,庫函數(shù)對(duì)
文件的操作實(shí)際上是通過系統(tǒng)調(diào)用來實(shí)現(xiàn)的。例如C庫函數(shù)fwrite()就是通過write()系統(tǒng)調(diào)用來實(shí)現(xiàn)的。
這樣的話,使用庫函數(shù)也有系統(tǒng)調(diào)用的開銷,為什么不直接使用系統(tǒng)調(diào)用呢?這是因?yàn)椋x寫文件通常是大量的數(shù)據(jù)(這種大量是相對(duì)于底層驅(qū)動(dòng)的系統(tǒng)調(diào)用所實(shí)現(xiàn)
的數(shù)據(jù)操作單位而言),這時(shí),使用庫函數(shù)就可以大大減少系統(tǒng)調(diào)用的次數(shù)。這一結(jié)果又緣于緩沖區(qū)技術(shù)。在用戶空間和內(nèi)核空間,對(duì)文件操作都使用了緩沖區(qū),例
如用fwrite寫文件,都是先將內(nèi)容寫到用戶空間緩沖區(qū),當(dāng)用戶空間緩沖區(qū)滿或者寫操作結(jié)束時(shí),才將用戶緩沖區(qū)的內(nèi)容寫到內(nèi)核緩沖區(qū),同樣的道理,當(dāng)內(nèi)
核緩沖區(qū)滿或?qū)懡Y(jié)束時(shí)才將內(nèi)核緩沖區(qū)內(nèi)容寫到文件對(duì)應(yīng)的硬件媒介。
2。庫函數(shù)調(diào)用
標(biāo)準(zhǔn)C庫函數(shù)提供的文件操作函數(shù)如fopen, fread, fwrite, fclose,
fflush, fseek等,需包含頭文件stdio.h。以fwrite為例,其函數(shù)原型為size_t fwrite(const void
*buffer, size_t size, size_t item_num, FILE *pf),其操作對(duì)象為文件指針FILE
*pf,要想寫一個(gè)文件,必須先以可寫權(quán)限用fopen函數(shù)打開一個(gè)文件,獲得所打開文件的FILE結(jié)構(gòu)指針pf,例如
pf=fopen(\"~/proj/filename\",
\"w\")。實(shí)際上,由于庫函數(shù)對(duì)文件的操作最終是通過系統(tǒng)調(diào)用實(shí)現(xiàn)的,因此,每打開一個(gè)文件所獲得的FILE結(jié)構(gòu)指針都有一個(gè)內(nèi)核空間的文件描述符
fd與之對(duì)應(yīng)。同樣有相應(yīng)的預(yù)定義的FILE指針:stdin-standard input,stdout-standard
output,stderr-standard error。
庫函數(shù)調(diào)用通常用于應(yīng)用程序中對(duì)一般文件的訪問。
庫函數(shù)調(diào)用是系統(tǒng)無關(guān)的,因此可移植性好。
由于庫函數(shù)調(diào)用是基于C庫的,因此也就不可能用于內(nèi)核空間的驅(qū)動(dòng)程序中對(duì)設(shè)備的操作.
from:
http://blog.c114.net/html/07/206807-17143.html
http://blog.chinaunix.net/u3/94284/showart_1898811.html
posted on 2010-03-01 22:03
chatler 閱讀(519)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
Linux_Coding