UNIX裡面關於標準IO的幾種緩衝機制

2021-08-26 19:01:20 字數 1366 閱讀 3939

編寫背後:國嵌的那段時間,老范曾讓我們幫回答下論壇某個會員的問題,**問題:出不來結果,沒任何列印資訊;

**如下():

#i nclude

main()

注意到,在**中printf語句列印的字串最後沒有帶換行符,而且最後呼叫了_exit函式,這導致了在終端螢幕上顯示不出來列印資訊。

首先介紹一下unix裡面關於標準io的幾種緩衝機制:

1、全緩衝 。全緩衝指的是系統在填滿標準io緩衝區之後才進行實際的io操作;注意,對於駐留在磁碟上的檔案來說通常是由標準io庫實施全緩衝。

2、行緩衝 。在這種情況下,標準io在輸入和輸出中遇到換行符時執行io操作;注意,當流涉及終端的時候,通常使用的是行緩衝。

3、無緩衝 。無緩衝指的是標準io庫不對字元進行緩衝儲存;注意,標準出錯流stderr通常是無緩衝的。

(本人對上面3個定義俗一點的理解)

行緩衝

其次介紹一下幾個退出函式:

1、exit ()。呼叫exit函式之後,它首先會執行一系列的清理處理,包括呼叫執行各終止處理程式,關閉所有標準io流等,然後進入核心。

2、_exit ()。與exit不同的是,它不進行清理工作而直接進入核心。此函式由posix.1說明,放在unistd.h裡面。

3、_exit ()。同樣,它也不進行清理工作而直接進入核心。此函式跟exit一樣由iso c說明,放在stdlib.h裡面。

由於printf函式是行緩衝的(因為它要往終端輸出資料),而且要列印的字串不帶換行符,因此在它沒有遇到換行符或者沒有填滿緩衝區之前不會進行實際的io操作,而緊接下來的_exit函式又立即進入核心沒有處理io緩衝區,所以我們在終端上看不到列印語句。

下面列出了幾種方法修正這段**

方法一:最簡單的莫過於增加乙個換行符:

#i nclude

main()

此時行緩衝遇到換行符/n,執行實際io操作。

方法二:呼叫exit函式,進行相應的io處理:

#i nclude

main()

輸出結果:

if i will be output ?if i will be in thebuffer?

exit函式在進入核心之前,對儲存在緩衝區內的資料進行沖洗,然後關閉io流。

方法三:呼叫fclose函式:

#i nclude

main()

(執行結果如圖)

實際上, fclose函式隱含包含了一次fflush操作,把緩衝區內的資料沖洗到終端。

Unix學習筆記 標準I O庫

流和file物件 對於標準i o庫,他們的操作時圍繞流進行的,當標準i o庫開啟或者建立乙個檔案時,我們使用乙個流和乙個檔案相關聯 對於ascii字符集,乙個字元用乙個位元組表示,對於標準字付集,乙個字元可用多個位元組表示。標準i o檔案流可用於單位元組或多位元組集。流的定向決定了讀 寫的字元是單位...

Unix學習筆記 標準I O庫

流和file物件 對於標準i o庫,他們的操作時圍繞流進行的,當標準i o庫開啟或者建立乙個檔案時,我們使用乙個流和乙個檔案相關聯 對於ascii字符集,乙個字元用乙個位元組表示,對於標準字付集,乙個字元可用多個位元組表示。標準i o檔案流可用於單位元組或多位元組集。流的定向決定了讀 寫的字元是單位...

unix環境高階程式設計 標準IO

標準io庫 不僅在unix上,在很多作業系統上都實現了標準的io庫,它處理了很多細節,例如緩衝區分配,優化長度執行io等。流和file物件 對於標準的io庫,它們的操作是圍繞流 stream 進行的。當用標準io庫開啟或建立乙個檔案時,已經使乙個流和乙個檔案相關聯,標準的io檔案流可用於單位元組和多...