緩衝 與 無緩衝

2021-09-20 17:52:43 字數 1284 閱讀 1749

先看下面的程式:

在上面的程式中printf函式列印的字串最後沒有帶換行符,而且最後呼叫了_exit()函式,這導致了最後沒有列印出 hello world;

下面先介紹幾種緩衝機制:

1、全緩衝 。全緩衝指的是系統在填滿標準io緩衝區之後才進行實際的io操作;注意,對於駐留在磁碟上的檔案來說通常是由標準io庫實施全緩衝。呼叫fflush函式沖洗乙個流。沖洗意味著將緩衝區的內容寫到磁碟上。

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

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

其次介紹幾個退出函式:

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

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

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

現在再來看上面的**,發現printf()是行緩衝的,而且列印的字串沒有換行符,因此在他沒有遇到換行符或者沒有填滿緩衝區之前是不會進行實際的i/o操作的,緊接下來的_exit函式又立即進入核心沒有處理i/o緩衝區,所以我們在終端上看不到hello world語句。

1.在字串後面加換行符,此時遇到換行符,執行io操作

2.呼叫exit()函式,exit函式在進入核心之前先清理緩衝區中的資料,然後關閉io流

3.可以呼叫fclose函式達到目的,

fclose函式隱含包含了一次fflush操作,把緩衝區內的

數     據沖洗到終端。 1

2

3

4

5

6

7

8

#include

intmain()

有緩衝與無緩衝的區別

無緩衝i o 不是核心不提供緩衝,而是對於使用者層來說,沒有提供快取,而對核心來說還是有快取的 資料 資料流 核心快取 磁碟 有緩衝i o 是指在使用者層上再建立了一層快取區 流快取區 目的是為了減少read,write等系統呼叫的使用次數,降低系統開銷。資料 資料流 流快取區 核心快取 磁碟 e....

標準I O緩衝 全緩衝 行緩衝 無緩衝

說明 我只對網路資源進行了整合,方便學習 基於流的操作最終會呼叫read或者write函式進行i o操作。為了使程式的執行效率最高,流物件通常會提供緩衝區,以減少呼叫系統i o庫函式的次數。基於流的i o提供以下3種緩衝 全緩衝 直到緩衝區被填滿,才呼叫系統i o函式。對於讀操作來說,直到讀入的內容...

標準I O緩衝 全緩衝 行緩衝 無緩衝

某日一朋友寫了乙個hello world 出不來結果,如下 include intmain int argc,char argv 注意到,在 中printf語句列印的字串最後沒有帶換行符,而且最後呼叫了 exit函式,這導致了在終端螢幕上顯示不出來字串 hello world 首先介紹一下unix裡...