研究系統IO和glib IO的關係

來源:互聯網
上載者:User

標籤:des   使用   strong   檔案   資料   os   

PS:這裡的緩衝與非緩衝的區別是相對於使用者進程,下文的“非緩衝檔案系統”指使用者的程式沒有緩衝區,不要誤解為系統沒有緩衝區。

1.緩衝檔案系統
緩 沖檔案系統的特點是:在記憶體開闢一個“緩衝區”,為程式中的每一個檔案使用,當執行讀檔案的操作時,從磁碟檔案將資料先讀入記憶體“緩衝區”, 裝滿後再從記憶體“緩衝區”依此讀入接收的變數。執行寫檔案的操作時,先將資料寫入記憶體“緩衝區”,待記憶體“緩衝區”裝滿後再寫入檔案。由此可以看出,記憶體 “緩衝區”的大小,影響著實際操作外存的次數,記憶體“緩衝區”越大,則操作外存的次數就少,執行速度就快、效率高。一般來說,檔案“緩衝區”的大小隨機器 而定。
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等(there has more function!!)
2.非緩衝檔案系統
緩 沖檔案系統是藉助檔案結構體指標(FILE)來對檔案進行管理,通過檔案指標來對檔案進行訪問,既可以讀寫字元、字串、格式化資料,也可以讀寫位元 據(openmode:r和ra)。非緩衝檔案系統依賴於作業系統,通過作業系統的功能對檔案進行讀寫,是系統級的輸入輸出,它不設檔案結構體指標(但是有檔案描述符),只能讀寫二進位檔案,但效率高、速度 快,由於ANSI標準不再包括非緩衝檔案系統(????really,setbuffer?),因此建議大家最好不要選擇它。本書(什麼書?)只作簡單介紹。open, close, read, write, getc, getchar, putc, putchar 等。

open 是系統調用 返回的是檔案控制代碼,檔案的控制代碼是檔案在檔案描述副表裡的索引,fopen是C的庫函數,返回的是一個指向檔案結構的指標。

fopen是ANSIC標準中的C語言庫函數,在不同的系統中應該調用不同的核心api
linux中的系統函數是open,fopen是其封裝函數,個人觀點。僅供參考。

檔案描述符是linux下的一個概念,linux下的一切裝置都是以檔案的形式操作.如網路通訊端、硬體裝置等。當然包括操作檔案。
fopen是標準c函數。返迴文件流而不是linux下檔案控制代碼。

裝置檔案不可以當成流式檔案來用,只能用open
fopen是用來操縱正規檔案的,並且設有緩衝的,跟open還是有一些區別

一般用fopen開啟普通檔案,用open開啟裝置檔案(really?&&why?)

fopen是標準c裡的,而open是linux的系統調用.
他們的層次不同.
fopen可移植,open不能

我認為fopen和open最主要的區別是fopen在使用者態下就有了緩衝(bingo!!),在進行 read和write的時候減少了使用者態和核心態的切換,而open則每次都需要進行核心態和使用者態的切換;表現為,如果順序訪問檔案,fopen系列的 函數要比直接調用open系列快;如果隨機訪問檔案open要比fopen快。

來自論壇的經典回答:

前者屬於低級IO,後者是進階IO。
前者返回一個檔案描述符(使用者程式區的),後者返回一個檔案指標。
前者無緩衝,後者有緩衝。
前者與 read, write 等配合使用, 後者與 fread, fwrite等配合使用。
後者是在前者的基礎上擴充而來的,在大多數情況下,用後者。

/****************************************************************************/

1,fread是帶緩衝的,read不帶緩衝. 
2,fopen是標準c裡定義的,open是POSIX中定義的. 
3,fread可以讀一個結構.read在linux/unix中讀二進位與普通檔案沒有區別. 
4,fopen不能指定要建立檔案的許可權.open可以指定許可權. 
5,fopen返回指標,open返迴文件描述符(整數). 
6,linux/unix中任何裝置都是檔案,都可以用open,read.

 

 

/************************************************************下篇文章說得比較清楚***************************************************************/

 

fread返回的是一個FILE結構指標
而read返回的是一個int的檔案號

前者fopen/fread的實現是靠調用底層的open/read來實現的.

fopen/fread
是C標準的庫函數,操作的對象是: file stream

open/read
是和作業系統有關的系統調用。操作的對象是: “file descriptor”


f是ANSI的C標準庫。後面的是UNIX下的系統調用。

帶f的帶有緩衝,是後面的衍生,
直接和硬體打交道,必須是後面的!

 

UNIX環境下的C 對二進位流檔案的讀寫有兩套班子:1) fopen,fread,fwrite ; 2) open, read, write
這裡簡單的介紹一下他們的區別。
1. fopen 系列是標準的C庫函數;open系列是 POSIX 定義的,是UNIX系統裡的system call。
也就是說,fopen系列更具有可移植性;而open系列只能用在 POSIX 的作業系統上。
2. 使用fopen 系列函數時要定義一個指代檔案的對象,被稱為“檔案控制代碼”(file handler),是一個結構體;而open系列使用的是一個被稱為“檔案描述符” (file descriptor)的int型整數。
3. fopen 系列是層級較高的I/O,讀寫時使用緩衝;而open系列相對低層,更接近作業系統,讀寫時沒有緩衝。由於能更多地與作業系統打交道,open系列可以訪問更改一些fopen系列無法訪問的資訊,如查看檔案的讀寫權限。這些額外的功能通常因系統而異。
4. 使用fopen系列函數需要"#include <sdtio.h>";使用open系列函數需要"#include <fcntl.h>" ,連結時要之用libc(-lc)
小結:
總的來說,為了使程式獲得更好的可移植性,未到非得使用一些fopen系列無法實現的功能的情況下,fopen系列是首選。

 

read/writefread/fwrite區別

1,fread是帶緩衝的,read不帶緩衝.

eg:

如果檔案的大小是8k。你如果用read/write,且只分配了2k的緩衝,則要將此檔案讀出需要做4次系統調用來實際從磁碟上讀出。
如果你用fread/fwrite,則系統自動分配緩衝,則讀出此檔案只要一次系統調用從磁碟上讀出。
也就是用read/write要讀4次磁碟,而用fread/fwrite則只要讀1次磁碟。效率比read/write要高4倍。


如果程式對記憶體有限制,則用read/write比較好
2,fopen是標準c裡定義的,open是POSIX中定義的.
3,fread可以讀一個結構. read在linux/unix中讀二進位與普通檔案沒有區別.
4,fopen不能指定要建立檔案的許可權.open可以指定許可權.
5,fopen返回指標,open返迴文件描述符(整數).
6,linux/unix中任何裝置都是檔案,都可以用open,read.

都用fread 和fwrite,它自動分配緩衝,速度會很快,比自己來做要簡單。如果要處理一些特殊的描述符,用read 和write,如套介面,管道之類的
系統調用write的效率取決於你buf的大小和你要寫入的總數量,如果buf太小,你進入核心空間的次數大增,效率就低下fwrite會替你做緩衝,減少了實際出現的系統調用,所以效率比較高。
如果只調用一次(可能嗎?),這倆差不多,嚴格來說write要快一點點(因為實際上fwrite最後還是用了write做真正的寫入檔案系統工作),但是這其中的差別無所謂。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.