檔案I O(不帶緩衝)之I O的效率

2022-05-04 20:30:10 字數 1070 閱讀 4688

程式清單3-3中的程式使用read和write函式複製檔案。關於該程式應注意下列各點:

它從標準輸入讀,寫至標準輸出,這就假定在執行本程式之前,這些標準輸入、輸出已由shell安排好。確實,所有常用的unix系統shell都提供一種方法,它在標準輸入上開啟乙個檔案用於讀,在標準輸出上建立(或重寫)乙個檔案。這使得程式不必自行開啟輸入和輸出檔案。

很多應用程式假定標準輸入是檔案描述符0,標準輸出是檔案描述符1。本示例中則使用在中定義的兩個名字:stdin_fileno和stdout_fileno。

考慮到程序終止時,unix系統核心會關閉該程序的所有開啟的檔案描述符,所以此示例並不會關閉輸入和輸出檔案。

對unix系統核心而言,文字檔案和二進位制**檔案並無區別,所以本示例對這兩種檔案都能工作。

程式清單3-3 將標準輸入複製到標誌輸出

[root@localhost apue]# cat prog3-3

.c#include

"apue.h

"#define buffsize 4096

intmain(

void

)

if(n < 0

) err_sys(

"read error");

exit(0);

}

這裡有乙個問題是,如何選取buffsize值?

用程式清單3-3中的程式讀檔案,其標準輸出被重定向到/dev/null上。此測試所用的檔案系統是linux ext2檔案系統,其塊長是4096位元組(塊長由st_blksize表示)。發現,系統cpu時間的最小值出現在buffsize為4096處,繼續增加緩衝區長度對此時間幾乎沒有影響。

大多數檔案系統為改善其效能都採用某種預讀(read ahead)技術。當檢測到正進行順序讀取時,系統就試圖讀入比應用程式所要求的更多的資料,並假想應用程式很快就會讀這些資料。

本篇博文內容摘自《unix環境高階程式設計》(第二版),僅作個人學習記錄所用。關於本書可參考:

不帶緩衝的檔案I O之引言

對於核心而言,所有開啟的檔案都通過檔案描述符引用。檔案描述符是乙個非負整數,變化範圍是 0 open max 1。當開啟乙個現有檔案或建立乙個新檔案時,核心向程序返回乙個檔案描述符。當讀 寫乙個檔案時,就使用 open 或 creat 返回的檔案描述符標識該檔案,將其作為引數傳送給 read 或 w...

linux不帶緩衝檔案IO

本博文設計的io不屬於ansi c的檔案io,所涉及的每乙個函式都是乙個系統呼叫。主要涉及posix.1的不帶快取的io操作的基礎部分。在linux核心中,對於乙個檔案的描述只需要乙個標示符即可。而不是乙個複雜的指標,僅僅是乙個int型的整數,有檔案描述符可以直接通過系統api直接操作核心資源,換句...

檔案I O(不帶緩衝)概述

unix系統中大多數檔案i o只需用到5個函式 open read write lseek以及close。這些函式經常被稱為不帶緩衝的i o unbuffered i o 術語不帶緩衝指的是每個read和write都呼叫核心中的乙個系統呼叫。這些不帶緩衝的i o函式不是iso c的組成部分,但是,它...