Linux下對文件操作有兩種方式:系統(tǒng)調(diào)用(system call)和庫函數(shù)調(diào)用(Library
functions)。可以參考《Linux程序設(shè)計》(英文原版為《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),其操作對象為文件描述符或文件句柄fd(file
descriptor),要想寫一個文件,必須先以可寫權(quán)限用open系統(tǒng)調(diào)用打開一個文件,獲得所打開文件的fd,例如
fd=open(\"/dev/video\",
O_RDWR)。fd是一個整型值,每新打開一個文件,所獲得的fd為當(dāng)前最大fd加1。Linux系統(tǒng)默認(rèn)分配了3個文件描述符
值:0-standard input,1-standard output,2-standard error。
系統(tǒng)調(diào)用通常用于底層文件訪問(low-level file access),例如在驅(qū)動程序中對設(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)行文件操作,會有用戶空間到內(nèi)核空間切換的開銷。事實上,即使在用戶空間使
用庫函數(shù)來對文件進(jìn)行操作,因為文件總是存在于存儲介質(zhì)上,因此不管是讀寫操作,都是對硬件(存儲器)的操作,都必然會引起系統(tǒng)調(diào)用。也就是說,庫函數(shù)對
文件的操作實際上是通過系統(tǒng)調(diào)用來實現(xiàn)的。例如C庫函數(shù)fwrite()就是通過write()系統(tǒng)調(diào)用來實現(xiàn)的。
這樣的話,使用庫函數(shù)也有系統(tǒng)調(diào)用的開銷,為什么不直接使用系統(tǒng)調(diào)用呢?這是因為,讀寫文件通常是大量的數(shù)據(jù)(這種大量是相對于底層驅(qū)動的系統(tǒng)調(diào)用所實現(xiàn)
的數(shù)據(jù)操作單位而言),這時,使用庫函數(shù)就可以大大減少系統(tǒng)調(diào)用的次數(shù)。這一結(jié)果又緣于緩沖區(qū)技術(shù)。在用戶空間和內(nèi)核空間,對文件操作都使用了緩沖區(qū),例
如用fwrite寫文件,都是先將內(nèi)容寫到用戶空間緩沖區(qū),當(dāng)用戶空間緩沖區(qū)滿或者寫操作結(jié)束時,才將用戶緩沖區(qū)的內(nèi)容寫到內(nèi)核緩沖區(qū),同樣的道理,當(dāng)內(nèi)
核緩沖區(qū)滿或?qū)懡Y(jié)束時才將內(nèi)核緩沖區(qū)內(nèi)容寫到文件對應(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),其操作對象為文件指針FILE
*pf,要想寫一個文件,必須先以可寫權(quán)限用fopen函數(shù)打開一個文件,獲得所打開文件的FILE結(jié)構(gòu)指針pf,例如
pf=fopen(\"~/proj/filename\",
\"w\")。實際上,由于庫函數(shù)對文件的操作最終是通過系統(tǒng)調(diào)用實現(xiàn)的,因此,每打開一個文件所獲得的FILE結(jié)構(gòu)指針都有一個內(nèi)核空間的文件描述符
fd與之對應(yīng)。同樣有相應(yīng)的預(yù)定義的FILE指針:stdin-standard input,stdout-standard
output,stderr-standard error。
庫函數(shù)調(diào)用通常用于應(yīng)用程序中對一般文件的訪問。
庫函數(shù)調(diào)用是系統(tǒng)無關(guān)的,因此可移植性好。
由于庫函數(shù)調(diào)用是基于C庫的,因此也就不可能用于內(nèi)核空間的驅(qū)動程序中對設(shè)備的操作.
from:
http://blog.c114.net/html/07/206807-17143.html
http://blog.chinaunix.net/u3/94284/showart_1898811.html
| 只有注冊用戶登錄后才能發(fā)表評論。 | ||
|
||
|
相關(guān)文章:
|
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|
|
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
|---|---|---|---|---|---|---|---|---|---|
| 25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | |||
| 15 | 16 | 17 | 18 | 19 | 20 | 21 | |||
| 22 | 23 | 24 | 25 | 26 | 27 | 28 | |||
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
常用鏈接
留言簿(10)
隨筆分類(307)
- Algorithm(22)

- apache(1)

- Assembly(1)

- browser(2)

- C++_BASIS(39)

- Compiling Theorem(1)

- CPU(1)

- cvs(3)

- Database(8)

- Designed Patterns(3)

- FileFormat(4)

- FileSystem(1)

- freebsd(1)

- Game(2)

- gdb(1)

- Gossips(12)

- GP_STL(3)

- interview(8)

- java

- life and living(1)

- linux kernel(12)

- Linux_Coding(43)

- Linux_Driver

- Linux_SysAdmin(26)

- makefile(3)

- misce(5)

- MultiCore(1)

- Network(14)

- OS(18)

- RegularExpression(1)

- schedule(1)

- SearchEngine(1)

- security(2)

- Shell(25)

- Socket(18)

- storage(2)

- Template(4)

- VC_MFC(4)

- vi(5)

- website(1)

- windows(7)

隨筆檔案(297)
- 2012年10月 (1)
- 2012年9月 (1)
- 2012年7月 (1)
- 2012年6月 (7)
- 2012年5月 (3)
- 2012年4月 (2)
- 2011年9月 (3)
- 2011年8月 (3)
- 2011年6月 (3)
- 2011年5月 (2)
- 2011年3月 (2)
- 2011年1月 (1)
- 2010年12月 (2)
- 2010年11月 (6)
- 2010年10月 (4)
- 2010年9月 (7)
- 2010年8月 (12)
- 2010年7月 (6)
- 2010年6月 (5)
- 2010年5月 (11)
- 2010年4月 (16)
- 2010年3月 (20)
- 2010年2月 (18)
- 2010年1月 (26)
- 2009年12月 (34)
- 2009年11月 (36)
- 2009年10月 (5)
- 2009年9月 (1)
- 2009年7月 (2)
- 2009年6月 (3)
- 2009年5月 (6)
- 2009年4月 (6)
- 2009年3月 (11)
- 2009年2月 (6)
- 2008年11月 (1)
- 2008年10月 (1)
- 2008年9月 (3)
- 2008年8月 (4)
- 2008年7月 (16)
algorithm
- andytan
- algorithm, linux, os, network,etc
- EXACT STRING MATCHING ALGORITHMS
- httperf -- a web perf test tool
- Java多線程
- 編程夜未眠
- 布薩空間
- 結(jié)構(gòu)之法
- 沈一峰 google技術(shù)博客
- 小兵的窩
Books_Free_Online
C++
- Bjarne Stroustrup's C++ Style and Technique FAQ
- boyplayee column
- C Plus Plus
- CPP Reference
- LearnC++Website
- Welcome to Bjarne Stroustrup's homepage!
database
Linux
Linux shell
linux socket
misce
- cloudward
- 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的
network
OSS
- Google Android
- Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
- os161 file list
overall
搜索
最新評論

- 1.?re: memcached完全剖析系列教程《轉(zhuǎn)》
- mark
- --zgpxgame
- 2.?re: 用prctl給線程命名
- 評論內(nèi)容較長,點擊標(biāo)題查看
- --none
- 3.?re: 用prctl給線程命名
- 請問大俠: 用top命令的時候可以顯示修改后的線程名么?如何做呢?
- --dhao123@sina.com
- 4.?re: 解決Linux pthread_create內(nèi)存泄漏問題
-
我試過,每一種方法有的時候不行。
第二種是可以的。
- --朱先生
- 5.?re: 著名程序庫的比較和學(xué)習(xí)經(jīng)驗
- 評論內(nèi)容較長,點擊標(biāo)題查看
- --buy dissertation
- 6.?re: linux的消息隊列與共享內(nèi)存編程
- 內(nèi)容選擇得很好,謝謝
- --朱志超
- 7.?re: 著名程序庫的比較和學(xué)習(xí)經(jīng)驗
- 評論內(nèi)容較長,點擊標(biāo)題查看
- --LillianHancock
- 8.?re: 解決Linux pthread_create內(nèi)存泄漏問題[未登錄]
- 不錯,支持一個。
- --jack
- 9.?re: 淺談游戲服務(wù)器---功能模塊上來看[未登錄]
- 不錯 好文!! 期待博主繼續(xù)
- --cppexplore
- 10.?re: 全面整理的C++面試題
- 評論內(nèi)容較長,點擊標(biāo)題查看
- --chatler
- 11.?re: 微軟面試中簡單的算法題目(轉(zhuǎn))
- 評論內(nèi)容較長,點擊標(biāo)題查看
- --chatler
- 12.?re: Browsers, processes, cookies and session state
- 每個IE Instance該是不同的進(jìn)程吧,可以獲取進(jìn)程ID,在每個instance里建一個名稱包含進(jìn)程id的目錄名,就可以分目錄存儲了吧。
- --chatler
- 13.?re: Browsers, processes, cookies and session state
-
文章說的很清楚,多謝
我有一個問題:
如何為每個ie instance ie實例的 Persistent cookies cookie 指定不同的存儲目錄? - --domolo
- 14.?re: 從一道面試題看指針與數(shù)組的區(qū)別
- 一個字,強(qiáng)!
- --路過
- 15.?re: 一個關(guān)于單向鏈表的面試題
- 評論內(nèi)容較長,點擊標(biāo)題查看
- --chatler
閱讀排行榜
- 1.?Windows Socket五種I/O模型(8350)
- 2.?最大公約數(shù)(Gcd)兩種算法(Euclid && Stein)<轉(zhuǎn)>(5506)
- 3.?用prctl給線程命名(5072)
- 4.?Linux core dump file詳解 <轉(zhuǎn)>(4500)
- 5.?算法面試題(3409)
- 6.?64位與32位編程的數(shù)據(jù)類型區(qū)別(3246)
- 7.?解決Linux pthread_create內(nèi)存泄漏問題(3156)
- 8.?NUMA與英特爾下一代Xeon處理器學(xué)習(xí)心得<轉(zhuǎn)>(3006)
- 9.?c語言抓取網(wǎng)頁數(shù)據(jù)(2842)
- 10.?CVSNT服務(wù)器配置——添加用戶、解決無法登陸(2747)
- 11.? pthread_join函數(shù)及l(fā)inux線程(2653)
- 12.?一個基于Event Poll(epoll)的TCP Server Framework,淺析epoll(2593)
-
13.?為 C/C++ 項目構(gòu)建您自己的內(nèi)存管理器
(2576) - 14.?memcached完全剖析系列教程《轉(zhuǎn)》(2521)
- 15.?G++編譯選項(2412)
- 16.?STL容器 erase的使用陷井<轉(zhuǎn)載>(2205)
- 17.?epoll使用例子(2131)
- 18.?linux的消息隊列與共享內(nèi)存編程(2078)
- 19.?gdb帶參數(shù)調(diào)試(2068)
- 20.?The Linux Kernel Module Programming Guide(2023)
- 21.?一個關(guān)于單向鏈表的面試題(1919)
- 22.?c中strncmp與memcmp的區(qū)別(1890)
- 23.?優(yōu)化Derby數(shù)據(jù)庫技巧(1840)
- 24.?一個基于完成端口的TCP Server Framework,淺析IOCP(1766)
- 25.?自己整理的指令(1758)
- 26.?autotools制作Makefile 和configure文件(1648)
- 27.?Google C++ Style Guide(1645)
- 28.?linux系統(tǒng)調(diào)用函數(shù)(1634)
- 29.?An In-Depth Look into the Win32 Portable Executable File Format(1633)
- 30.? vim大小寫轉(zhuǎn)換(1591)
- 31.?淺談游戲服務(wù)器---功能模塊上來看(1562)
-
32.?MIPS architecture
(1522) - 33.?教你用c實現(xiàn)http協(xié)議(1513)
- 34.?Aix下查看占用端口的進(jìn)程(1487)
- 35.?史上最強(qiáng)bash函數(shù)庫(1415)
- 36.?linux trap詳解(1348)
- 37.?ms,google,vmware,nvidia美國總部面試題(1333)
- 38.?多CPU上的原子操作(1324)
- 39.?power函數(shù)寫法《轉(zhuǎn)》(1291)
-
40.?Critical Section
(1261)
評論排行榜
- 1.?著名程序庫的比較和學(xué)習(xí)經(jīng)驗(3)
- 2.?用prctl給線程命名(2)
-
3.?Browsers, processes, cookies and session state
(2) - 4.?解決Linux pthread_create內(nèi)存泄漏問題(2)
- 5.?從一道面試題看指針與數(shù)組的區(qū)別 <轉(zhuǎn)>(1)
- 6.?全面整理的C++面試題(1)
- 7.?微軟面試中簡單的算法題目(轉(zhuǎn))(1)
- 8.?一個關(guān)于單向鏈表的面試題(1)
- 9.?memcached完全剖析系列教程《轉(zhuǎn)》(1)
- 10.?linux的消息隊列與共享內(nèi)存編程(1)
- 11.?淺談游戲服務(wù)器---功能模塊上來看(1)
- 12.?C Language Know-how(0)
- 13.?shell中管道兩邊的進(jìn)程是怎么通信的(0)
- 14.?Linux 內(nèi)核筆記2 – 進(jìn)程調(diào)度(0)
- 15.? 如何準(zhǔn)確的截取出IP段(0)
- 16.?LINUX命令xargs的簡單應(yīng)用及舉例(0)
- 17.?查看系統(tǒng)調(diào)用和信號的命令--strace(0)
- 18.?brk__sbrk(0)
- 19.?6個變態(tài)的C語言Hello World程序(0)
- 20.?如何寫一個網(wǎng)絡(luò)蜘蛛(0)
- 21.?open和fopen的區(qū)別(0)
- 22.?如何讀取一行中的多個數(shù)據(jù)(0)
- 23.?Context Switch Definition(0)
- 24.?VIM技巧(0)
- 25.?What is the difference between user level threads and kernel level threads?(0)
- 26.?如何在Linux內(nèi)核中寫文件(0)
- 27.?簡歷中的自我評價用語(0)
- 28.?雅虎給出的34條網(wǎng)站加速方法(0)
- 29.?必看的70道面試題回答(0)
- 30.?linux常用C函數(shù)(0)
- 31.?Linux下的文件操作:系統(tǒng)調(diào)用還是庫函數(shù)調(diào)用?(0)
- 32.?malloc and realloc(0)
- 33.?五大非常見Linux命令(0)
- 34.?Hash Function related(0)
- 35.?gdb know-how(0)
- 36.?Knuth–Morris–Pratt algorithm(0)
- 37.?幾個很有用的系統(tǒng)宏(0)
- 38.?Hash 算法及其應(yīng)用(0)
- 39.?process and thread屬性讀取(0)
- 40.?C語言優(yōu)先級(0)
