【Linux系统编程】 浅谈标准I/O缓冲区
標(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; }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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【SSL】SSL工作原理
- 下一篇: 【Linux系统编程】 Linux系统调