Linux下對文件操作有兩種方式:系統調用(system call)和庫函數調用(Library
functions)??梢詤⒖肌禠inux程序設計》(英文原版為《Beginning Linux Programming》,作者是Neil
Matthew和Richard Stones)第三章: Working with files。
1。系統調用
系統調用提供的函數如open, close, read, write,
ioctl等,需包含頭文件unistd.h。以write為例:其函數原型為 size_t write(int fd, const void
*buf, size_t nbytes),其操作對象為文件描述符或文件句柄fd(file
descriptor),要想寫一個文件,必須先以可寫權限用open系統調用打開一個文件,獲得所打開文件的fd,例如
fd=open(\"/dev/video\",
O_RDWR)。fd是一個整型值,每新打開一個文件,所獲得的fd為當前最大fd加1。Linux系統默認分配了3個文件描述符
值:0-standard input,1-standard output,2-standard error。
系統調用通常用于底層文件訪問(low-level file access),例如在驅動程序中對設備文件的直接訪問。
系統調用是操作系統相關的,因此一般沒有跨操作系統的可移植性。
系統調用發生在內核空間,因此如果在用戶空間的一般應用程序中使用系統調用來進行文件操作,會有用戶空間到內核空間切換的開銷。事實上,即使在用戶空間使
用庫函數來對文件進行操作,因為文件總是存在于存儲介質上,因此不管是讀寫操作,都是對硬件(存儲器)的操作,都必然會引起系統調用。也就是說,庫函數對
文件的操作實際上是通過系統調用來實現的。例如C庫函數fwrite()就是通過write()系統調用來實現的。
這樣的話,使用庫函數也有系統調用的開銷,為什么不直接使用系統調用呢?這是因為,讀寫文件通常是大量的數據(這種大量是相對于底層驅動的系統調用所實現
的數據操作單位而言),這時,使用庫函數就可以大大減少系統調用的次數。這一結果又緣于緩沖區技術。在用戶空間和內核空間,對文件操作都使用了緩沖區,例
如用fwrite寫文件,都是先將內容寫到用戶空間緩沖區,當用戶空間緩沖區滿或者寫操作結束時,才將用戶緩沖區的內容寫到內核緩沖區,同樣的道理,當內
核緩沖區滿或寫結束時才將內核緩沖區內容寫到文件對應的硬件媒介。
2。庫函數調用
標準C庫函數提供的文件操作函數如fopen, fread, fwrite, fclose,
fflush, fseek等,需包含頭文件stdio.h。以fwrite為例,其函數原型為size_t fwrite(const void
*buffer, size_t size, size_t item_num, FILE *pf),其操作對象為文件指針FILE
*pf,要想寫一個文件,必須先以可寫權限用fopen函數打開一個文件,獲得所打開文件的FILE結構指針pf,例如
pf=fopen(\"~/proj/filename\",
\"w\")。實際上,由于庫函數對文件的操作最終是通過系統調用實現的,因此,每打開一個文件所獲得的FILE結構指針都有一個內核空間的文件描述符
fd與之對應。同樣有相應的預定義的FILE指針:stdin-standard input,stdout-standard
output,stderr-standard error。
庫函數調用通常用于應用程序中對一般文件的訪問。
庫函數調用是系統無關的,因此可移植性好。
由于庫函數調用是基于C庫的,因此也就不可能用于內核空間的驅動程序中對設備的操作.
from:
http://blog.c114.net/html/07/206807-17143.html
http://blog.chinaunix.net/u3/94284/showart_1898811.html
| 只有注冊用戶登錄后才能發表評論。 | ||
|
||
|
相關文章:
|
||
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
|
||
|
|
| |||||||||
| 日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
|---|---|---|---|---|---|---|---|---|---|
| 28 | 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 | 29 | 30 | 31 | 1 | 2 | 3 | |||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 | |||
常用鏈接
留言簿(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多線程
- 編程夜未眠
- 布薩空間
- 結構之法
- 沈一峰 google技術博客
- 小兵的窩
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
- 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的
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完全剖析系列教程《轉》
- mark
- --zgpxgame
- 2.?re: 用prctl給線程命名
- 評論內容較長,點擊標題查看
- --none
- 3.?re: 用prctl給線程命名
- 請問大俠: 用top命令的時候可以顯示修改后的線程名么?如何做呢?
- --dhao123@sina.com
- 4.?re: 解決Linux pthread_create內存泄漏問題
-
我試過,每一種方法有的時候不行。
第二種是可以的。
- --朱先生
- 5.?re: 著名程序庫的比較和學習經驗
- 評論內容較長,點擊標題查看
- --buy dissertation
- 6.?re: linux的消息隊列與共享內存編程
- 內容選擇得很好,謝謝
- --朱志超
- 7.?re: 著名程序庫的比較和學習經驗
- 評論內容較長,點擊標題查看
- --LillianHancock
- 8.?re: 解決Linux pthread_create內存泄漏問題[未登錄]
- 不錯,支持一個。
- --jack
- 9.?re: 淺談游戲服務器---功能模塊上來看[未登錄]
- 不錯 好文!! 期待博主繼續
- --cppexplore
- 10.?re: 全面整理的C++面試題
- 評論內容較長,點擊標題查看
- --chatler
- 11.?re: 微軟面試中簡單的算法題目(轉)
- 評論內容較長,點擊標題查看
- --chatler
- 12.?re: Browsers, processes, cookies and session state
- 每個IE Instance該是不同的進程吧,可以獲取進程ID,在每個instance里建一個名稱包含進程id的目錄名,就可以分目錄存儲了吧。
- --chatler
- 13.?re: Browsers, processes, cookies and session state
-
文章說的很清楚,多謝
我有一個問題:
如何為每個ie instance ie實例的 Persistent cookies cookie 指定不同的存儲目錄? - --domolo
- 14.?re: 從一道面試題看指針與數組的區別
- 一個字,強!
- --路過
- 15.?re: 一個關于單向鏈表的面試題
- 評論內容較長,點擊標題查看
- --chatler
閱讀排行榜
- 1.?Windows Socket五種I/O模型(8350)
- 2.?最大公約數(Gcd)兩種算法(Euclid && Stein)<轉>(5506)
- 3.?用prctl給線程命名(5072)
- 4.?Linux core dump file詳解 <轉>(4500)
- 5.?算法面試題(3409)
- 6.?64位與32位編程的數據類型區別(3246)
- 7.?解決Linux pthread_create內存泄漏問題(3156)
- 8.?NUMA與英特爾下一代Xeon處理器學習心得<轉>(3006)
- 9.?c語言抓取網頁數據(2842)
- 10.?CVSNT服務器配置——添加用戶、解決無法登陸(2747)
- 11.? pthread_join函數及linux線程(2653)
- 12.?一個基于Event Poll(epoll)的TCP Server Framework,淺析epoll(2593)
-
13.?為 C/C++ 項目構建您自己的內存管理器
(2576) - 14.?memcached完全剖析系列教程《轉》(2521)
- 15.?G++編譯選項(2412)
- 16.?STL容器 erase的使用陷井<轉載>(2205)
- 17.?epoll使用例子(2131)
- 18.?linux的消息隊列與共享內存編程(2078)
- 19.?gdb帶參數調試(2068)
- 20.?The Linux Kernel Module Programming Guide(2023)
- 21.?一個關于單向鏈表的面試題(1919)
- 22.?c中strncmp與memcmp的區別(1890)
- 23.?優化Derby數據庫技巧(1840)
- 24.?一個基于完成端口的TCP Server Framework,淺析IOCP(1766)
- 25.?自己整理的指令(1758)
- 26.?autotools制作Makefile 和configure文件(1648)
- 27.?Google C++ Style Guide(1645)
- 28.?linux系統調用函數(1634)
- 29.?An In-Depth Look into the Win32 Portable Executable File Format(1633)
- 30.? vim大小寫轉換(1591)
- 31.?淺談游戲服務器---功能模塊上來看(1562)
-
32.?MIPS architecture
(1522) - 33.?教你用c實現http協議(1513)
- 34.?Aix下查看占用端口的進程(1487)
- 35.?史上最強bash函數庫(1415)
- 36.?linux trap詳解(1348)
- 37.?ms,google,vmware,nvidia美國總部面試題(1333)
- 38.?多CPU上的原子操作(1324)
- 39.?power函數寫法《轉》(1291)
-
40.?Critical Section
(1261)
評論排行榜
- 1.?著名程序庫的比較和學習經驗(3)
- 2.?用prctl給線程命名(2)
-
3.?Browsers, processes, cookies and session state
(2) - 4.?解決Linux pthread_create內存泄漏問題(2)
- 5.?從一道面試題看指針與數組的區別 <轉>(1)
- 6.?全面整理的C++面試題(1)
- 7.?微軟面試中簡單的算法題目(轉)(1)
- 8.?一個關于單向鏈表的面試題(1)
- 9.?memcached完全剖析系列教程《轉》(1)
- 10.?linux的消息隊列與共享內存編程(1)
- 11.?淺談游戲服務器---功能模塊上來看(1)
- 12.?C Language Know-how(0)
- 13.?shell中管道兩邊的進程是怎么通信的(0)
- 14.?Linux 內核筆記2 – 進程調度(0)
- 15.? 如何準確的截取出IP段(0)
- 16.?LINUX命令xargs的簡單應用及舉例(0)
- 17.?查看系統調用和信號的命令--strace(0)
- 18.?brk__sbrk(0)
- 19.?6個變態的C語言Hello World程序(0)
- 20.?如何寫一個網絡蜘蛛(0)
- 21.?open和fopen的區別(0)
- 22.?如何讀取一行中的多個數據(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內核中寫文件(0)
- 27.?簡歷中的自我評價用語(0)
- 28.?雅虎給出的34條網站加速方法(0)
- 29.?必看的70道面試題回答(0)
- 30.?linux常用C函數(0)
- 31.?Linux下的文件操作:系統調用還是庫函數調用?(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.?幾個很有用的系統宏(0)
- 38.?Hash 算法及其應用(0)
- 39.?process and thread屬性讀取(0)
- 40.?C語言優先級(0)
