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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

【Linux系统编程】 浅谈标准I/O缓冲区

發(fā)布時間:2024/4/20 linux 70 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Linux系统编程】 浅谈标准I/O缓冲区 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

標(biāo)準(zhǔn)I/O庫提供緩沖的目的是盡可能地減少使用read和write調(diào)用的次數(shù)。它也對每個I/O流自動地進(jìn)行緩沖管理,從而避免了應(yīng)用程序需要考慮這一點(diǎn)所帶來的麻煩。不幸的是,標(biāo)準(zhǔn)I/O庫最令人迷惑的也是它的緩沖。


標(biāo)準(zhǔn)I/O提供了三種類型的緩沖:

1、全緩沖:

在填滿標(biāo)準(zhǔn)I/O緩沖區(qū)后才進(jìn)行實(shí)際I/O操作。常規(guī)文件(如普通文本文件)通常是全緩沖的。


2、行緩沖:

當(dāng)在輸入和輸出中遇到換行符時,標(biāo)準(zhǔn)I/O庫執(zhí)行I/O操作。這允許我們一次輸出一個字符,但只有在寫了一行之后才進(jìn)行實(shí)際I/O操作。標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出對應(yīng)終端設(shè)備(如屏幕)時通常是行緩沖的。


3、不帶緩沖:

用戶程序每次調(diào)庫函數(shù)做寫操作都要通過系統(tǒng)調(diào)用寫回內(nèi)核(如系統(tǒng)調(diào)用函數(shù))。標(biāo)準(zhǔn)錯誤輸出通常是無緩沖的,這樣用戶程序產(chǎn)生的錯誤信息可以盡快輸出到設(shè)備。


下面是各個緩沖區(qū)的驗證。


全緩沖:

int main(int argc, char *argv[]) {FILE *fp = NULL;// 讀寫方式打開,文件不存在則創(chuàng)建fp = fopen("sunplusedu.txt", "w+");if(NULL == fp){printf("open error\n");return 1;}char *str = "sunplusedu\n";fwrite(str, 1, strlen(str), fp); // 往文件寫內(nèi)容while(1); // 程序阻塞在這里return 0; }

運(yùn)行程序發(fā)現(xiàn),sunplusedu.txt并沒有內(nèi)容。因為常規(guī)文件通常是全緩沖的,只有緩沖區(qū)滿了后,才會把內(nèi)容寫到文件中。接下來,我們改一下上面那個例子。

#include <stdio.h> #include <string.h>int main(int argc, char *argv[]) {FILE *fp = NULL;// 讀寫方式打開,文件不存在則創(chuàng)建fp = fopen("sunplusedu.txt", "w+");if(NULL == fp){printf("open error\n");return 1;}char *str = "sunplusedu\n";int i = 0;while(i <= 512){ // 緩沖區(qū)大小不確定,i的大小只是一個調(diào)試值fwrite(str, 1, strlen(str), fp); // 往文件寫內(nèi)容i++;}while(1); // 程序阻塞在這里return 0; }


上面的例子是循環(huán)給文件寫內(nèi)容,讓緩沖區(qū)有填滿的可能,結(jié)果發(fā)現(xiàn),文件是有內(nèi)容的。實(shí)際上要想成功給文件寫進(jìn)內(nèi)容,除了緩沖區(qū)填滿,還有別的方法。


1)人為關(guān)閉文件,就算緩沖區(qū)沒有填滿,內(nèi)容也會寫進(jìn)文件

#include <stdio.h> #include <string.h>int main(int argc, char *argv[]) {FILE *fp = NULL;// 讀寫方式打開,文件不存在則創(chuàng)建fp = fopen("sunplusedu.txt", "w+");if(NULL == fp){printf("open error\n");return 1;}char *str = "sunplusedu\n";fwrite(str, 1, strlen(str), fp); // 往文件寫內(nèi)容fclose(fp); // 人為關(guān)閉文件,就算緩沖區(qū)沒有填滿,內(nèi)容也會寫進(jìn)文件while(1); // 程序阻塞在這里return 0; }

2)程序正常結(jié)束,就算緩沖區(qū)沒有填滿,沒有關(guān)閉文件,內(nèi)容也會寫進(jìn)文件。

#include <stdio.h> #include <string.h>int main(int argc, char *argv[]) {FILE *fp = NULL;// 讀寫方式打開,文件不存在則創(chuàng)建fp = fopen("sunplusedu.txt", "w+");if(NULL == fp){printf("open error\n");return 1;}char *str = "sunplusedu\n";fwrite(str, 1, strlen(str), fp); // 往文件寫內(nèi)容return 0;// 程序正常結(jié)束,就算緩沖區(qū)沒有填滿,沒有關(guān)閉文件,內(nèi)容也會寫進(jìn)文件。 }

行緩沖:

#include <stdio.h>int main(int argc, char *argv[]) {printf("hello sunplusedu");while(1);return 0; }

運(yùn)行這個程序,會發(fā)現(xiàn) hello sunplusedu 并沒有打印到屏幕上。因為標(biāo)準(zhǔn)輸入和標(biāo)準(zhǔn)輸出對應(yīng)終端設(shè)備時通常是行緩沖的,當(dāng)在輸入和輸出中遇到換行符時,標(biāo)準(zhǔn)I/O庫執(zhí)行I/O操作。如下:

#include <stdio.h>int main(int argc, char *argv[]) {printf("hello sunplusedu\n");while(1);return 0; }


除了遇到換行符,還有別的方法可以執(zhí)行I/O操作。


1)緩沖區(qū)填滿

int main(int argc, char *argv[]) {while(1){ // 循環(huán)打印,總有緩沖區(qū)填滿的可能printf("hello sunplusedu");}while(1);return 0; }

2)人為刷新緩沖區(qū)

#include <stdio.h>int main(int argc, char *argv[]) {printf("hello sunplusedu");fflush(stdout); // 人為刷新while(1);return 0; }

3)程序正常結(jié)束

#include <stdio.h>int main(int argc, char *argv[]) {printf("hello sunplusedu");return 0;// 程序正常結(jié)束 }

不帶緩沖:

#include <unistd.h> #include <string.h>int main(int argc, char *argv[]) {char *str = "hello sunplusedu.com"; // 有沒有\(zhòng)n,緩沖區(qū)有沒有填滿,都沒關(guān)系write(1, str, strlen(str)); // 往標(biāo)準(zhǔn)輸出寫內(nèi)容while(1);return 0; }

總結(jié)

以上是生活随笔為你收集整理的【Linux系统编程】 浅谈标准I/O缓冲区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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