日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

(转)标准I/O缓冲:全缓冲、行缓冲、无缓冲 .

發(fā)布時(shí)間:2024/4/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)标准I/O缓冲:全缓冲、行缓冲、无缓冲 . 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

某日一朋友寫了一個(gè)HELLO WORLD代碼,出不來(lái)結(jié)果,代碼如下:


#include <stdio.h>

int

main(int argc, char **argv){

??? printf("hello world!");

??? _Exit(0);

}

?


?

注意到,在代碼中printf語(yǔ)句打印的字符串最后沒(méi)有帶換行符,而且最后調(diào)用了_Exit函數(shù),這導(dǎo)致了在終端屏幕上顯示不出來(lái)字符串"hello world!"。

?

首先介紹一下UNIX里面關(guān)于標(biāo)準(zhǔn)IO的幾種緩沖機(jī)制:

1、全緩沖 。全緩沖指的是系統(tǒng)在填滿標(biāo)準(zhǔn)IO緩沖區(qū)之后才進(jìn)行實(shí)際的IO操作;注意,對(duì)于駐留在磁盤上的文件來(lái)說(shuō)通常是由標(biāo)準(zhǔn)IO庫(kù)實(shí)施全緩沖。

2、行緩沖 。在這種情況下,標(biāo)準(zhǔn)IO在輸入和輸出中遇到換行符時(shí)執(zhí)行IO操作;注意,當(dāng)流涉及終端的時(shí)候,通常使用的是行緩沖。

3、無(wú)緩沖 。無(wú)緩沖指的是標(biāo)準(zhǔn)IO庫(kù)不對(duì)字符進(jìn)行緩沖存儲(chǔ);注意,標(biāo)準(zhǔn)出錯(cuò)流stderr通常是無(wú)緩沖的。

?

其次介紹一下幾個(gè)退出函數(shù):

1、exit ()。調(diào)用exit函數(shù)之后,它首先會(huì)執(zhí)行一系列的清理處理,包括調(diào)用執(zhí)行各終止處理程序,關(guān)閉所有標(biāo)準(zhǔn)IO流等,然后進(jìn)入內(nèi)核。

2、_exit ()。與exit不同的是,它不進(jìn)行清理工作而直接進(jìn)入內(nèi)核。此函數(shù)由POSIX.1說(shuō)明,放在unistd.h里面。

3、_Exit ()。同樣,它也不進(jìn)行清理工作而直接進(jìn)入內(nèi)核。此函數(shù)跟exit一樣由ISO C說(shuō)明,放在stdlib.h里面。

?

現(xiàn)在回過(guò)頭來(lái)看上面的那段代碼,很容易發(fā)現(xiàn),由于printf函數(shù)是行緩沖的(因?yàn)樗K端輸出數(shù)據(jù)),而且要打印的字符串不帶換行符,因此在它沒(méi)有遇到換行符或者沒(méi)有填滿緩沖區(qū)之前不會(huì)進(jìn)行實(shí)際的IO操作,而緊接下來(lái)的_Exit函數(shù)又立即進(jìn)入內(nèi)核沒(méi)有處理IO緩沖區(qū),所以我們?cè)诮K端上看不到hello world語(yǔ)句。

?

我們可以有很多方法修正這段代碼。最簡(jiǎn)單的莫過(guò)于增加一個(gè)換行符:

?


#include <stdio.h>

int

main(int argc, char **argv){

??? printf("hello world!/n");

??? _Exit(0);

}


此時(shí)行緩沖遇到換行符/n,執(zhí)行實(shí)際IO操作。

?

其次,我們可以調(diào)用exit函數(shù),讓它幫我們進(jìn)行相應(yīng)的IO處理:

?


#include <stdio.h>

int

main(int argc, char **argv){

??? printf("hello world!");

??? exit(0);

}


exit函數(shù)在進(jìn)入內(nèi)核之前,對(duì)存儲(chǔ)在緩沖區(qū)內(nèi)的數(shù)據(jù)進(jìn)行沖洗,然后關(guān)閉IO流。

?

或者,我們可以改變標(biāo)準(zhǔn)輸出流的默認(rèn)緩沖模式:

?


#include <stdio.h>

int

main(int argc, char **argv){

??? setvbuf(stdout, NULL, _IONBF, 0);

??? printf("hello world!");

??? _Exit(0);

}


此時(shí),由于調(diào)用了setvbuf函數(shù),把標(biāo)準(zhǔn)輸出流默認(rèn)的行緩沖變成了無(wú)緩沖(具體請(qǐng)查閱setvbuf函數(shù)實(shí)現(xiàn)機(jī)制),因此調(diào)用printf時(shí)立即輸出。

?

當(dāng)然,我們還可以調(diào)用fclose函數(shù)來(lái)達(dá)到此目的:

?


#include <stdio.h>

int

main(int argc, char **argv){

??? printf("hello world!");

??? fclose(stdout);

??? _Exit(0);

}


實(shí)際上, fclose函數(shù)隱含包含了一次fflush操作,把緩沖區(qū)內(nèi)的數(shù)據(jù)沖洗到終端。

?http://blog.csdn.net/seton040/article/details/4504825

轉(zhuǎn)載于:https://www.cnblogs.com/wonderKK/archive/2012/06/13/2547740.html

總結(jié)

以上是生活随笔為你收集整理的(转)标准I/O缓冲:全缓冲、行缓冲、无缓冲 .的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。