標準I O之實現細節

2022-05-04 20:24:08 字數 2137 閱讀 9519

在unix系統中,標準i/o庫最終都要呼叫檔案i/o(read、write等)。每個標準i/o流都有乙個與其相關聯的檔案描述符,可以對乙個流呼叫fileno函式以獲得其描述符。

注意,fileno不是iso c標準部分,而是posix.1支援的擴充套件。

#include int fileno( file *fp );

如果要呼叫dup或fcntl等函式,則需要此函式。

為了了解你所使用的系統中標準i/o庫的實現,最好從頭檔案開始。從中可以看到:file物件是如何定義的、每個流標誌的定義以及定義為巨集的各個標準i/o例程(例如getc)。

程式清單5-3中的程式為三個標準流以及乙個普通檔案相關聯的流列印有關緩衝的狀態資訊。

程式清單5-3 對各個標準i/o流列印緩衝狀態資訊

[root@localhost apue]# cat prog5-3

.c#include

"apue.h

"void pr_stdio( const

char *, file *);

intmain(

void

)void

pr_stdio(

const

char *name, file *fp)

注意,在列印緩衝狀態資訊之前,先對每個流執行i/o操作,第乙個i/o操作通常就造成為該流分配緩衝。結構成員_io_file_flags、_io_buf_base、_io_buf_end和常量_io_unbuffered、_io_line_buffered是由linux中的gnu標準i/o庫定義的。應當了解,其他unix系統可能會有不同的標準i/o庫實現。

如果執行程式清單5-3中的程式兩次,一次使三個標準流與終端相連線,另一次使它們重定向到普通檔案,則所得結果是:

[root@localhost apue]# ./prog5-3

stdin、stdout和stderr都連至終端

enter any character

鍵入換行符

one line to standard error

stream = stdin, line buffered, buffer size = 4096

stream = stdout, line buffered, buffer size = 4096

stream = stderr, unbuffered, buffer size = 1

stream = /etc/mtab, fully buffered, buffer size = 4096

[root@localhost apue]# ./prog5-3

< /etc/termcap > std.out

2>std.err

三個流都重定向,再次執行該程式

[root@localhost apue]# cat std.err

one line to standard error

[root@localhost apue]# cat std.

outenter any character

stream = stdin, fully buffered, buffer size = 4096

stream = stdout, fully buffered, buffer size = 4096

stream = stderr, unbuffered, buffer size = 1

stream = /etc/mtab, fully buffered, buffer size = 4096

從中可見,該系統的預設情況是:當標準輸入、輸出連至終端時,它們是行緩衝的。行緩衝的長度是4096位元組。注意,這並沒有將輸入、輸出的行長限制為4096位元組,這只是緩衝區的長度。如果要將8192位元組的行寫到標準輸出,則要進行兩次write系統呼叫。當將這兩個流重定向到普通檔案時,它們就變成是全緩衝的,其緩衝區長度是該檔案系統優先選用的i/o長度(從stat結構中得到的st_blksize值)。從中也可看到,標準出錯如它所應該的那樣是非緩衝的,而普通檔案按系統預設是全緩衝的。

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

標準IO以及標準IO實現拷貝

1 include 2 include 3 include 4int main 513char s this is test.14 size t ret fwrite s,1 strlen s fp 15 if 0 ret 16 寫完指標指向最後,如果讀的話需要移動指標 20fseek fp,0,s...

I O 標準 I O 實驗

一 測試標準 i o 一次可以同時開啟多少個檔案 1 實驗思路 利用迴圈同時開啟檔案,直到不能開啟 2 如下 二 fgetc 和 fputc 實現拷貝檔案並輸出檔案行數 1 實驗思路 開啟檔案,用 fgetc 讀取,然後 fputc 輸出 2 如下 三 fgetc 和 putchar 實現只輸出字母...

系統IO與標準IO

第十章的學習中,我們學習了open,close,read,lseek,statu函式以及理解了共享檔案的定義,下面通過對一些例子的分析來進一步了解第十章學習的內容。例1 ffiles1.c int main int argc,char ar 該例的執行結果為 分析 在該例中,首先開啟了同乙個檔案3次...