1. 程式人生 > >Linux中I/O steam中的緩衝解析

Linux中I/O steam中的緩衝解析

緩衝,快取之類的術語,通常都會和執行效率聯絡到一起,在標準I/O庫中提供緩衝的主要目的就是減少系統函式read和write的呼叫,從而能夠減少系統CPU時間。標準I/O庫的緩衝主要分為3種:全緩衝、行緩衝和不緩衝。

全緩衝

全緩衝就是當輸入或輸出時,當緩衝區被填滿了之後,才會進行實際的I/O操作。下面是一個將”hello world!”寫入log.txt檔案的程式,演示了這一個過程。log.txt是空檔案,長度為0。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main(void
) { FILE *stream; if ((stream = fopen("./log.txt", "a")) == NULL) { printf("error: %d\n", errno); exit(1); } char buf[BUFSIZ]; setvbuf(stream, buf, _IOFBF, BUFSIZ); fputs("hello world!", stream); sleep(20); return 0; }

上例程式碼通過setvbuf函式設定stream流是全緩衝,_IOFBF表示io full buffer的意思,編譯執行這個程式,然後立馬檢視log.txt檔案:

$ ls -l log.txt
-rw-r--r-- 1 root root 0 Nov 20 22:40 log.txt

會發現檔案的長度是0,直到睡眠結束後,字元”hello world!”才會寫入到log.txt檔案。
如果fputs了很多次後,長度還是小於BUFSIZ,但是需要將這些內容都實際寫入檔案,可以使用fflush函式。fflush函式根據指定的檔案流將緩衝區的內容進行實際的操作,並清空緩衝區;如果引數為NULL,則會對所有開啟的檔案流操作。例如上例,只要在

fputs("hello world!", stream);

程式碼後面加上下面一行程式碼就OK了。

fflush
(stream);

編譯執行程式碼,可以發現即使程式還在睡眠,但是內容已經寫入log.txt了。

行緩衝

當在輸入或輸出中遇到換行符時,才進行實際I/O操作。linux下標準輸出預設是行緩衝,下面的例子使用標準輸出演示這一個過程。

#include <stdio.h>

int main(void)
{
    fputs("hello", stdout);
    sleep(2);
    //這裡一開始輸出了換行符,所以前面的hello就被輸出到螢幕上了。
    fputs("\nworld", stdout);
    sleep(2);

    return 0;
}

編譯執行上面的程式,應當看到過兩秒才會輸出一個”hello”,再過兩秒才輸出”word”,然後程式就結束了。在C語言中,可以通過setvbuf來設定緩衝模式,其中_IOLBF表示行緩衝,就是io line buffer的意思。

無緩衝

標準I/O庫不進行任何字元緩衝,任何讀寫都是即時可見的。linux下標準錯誤輸出預設是不緩衝,修改上面的例子:

#include <stdio.h>

int main(void)
{
    fputs("hello", stderr);
    sleep(2);
    fputs("world", stderr);
    sleep(2);

    return 0;
}

編譯執行上面的程式,結果就比較顯而易見了。程式一執行的時候就會輸出”hello”,過兩秒輸出”world”,再過兩秒程式就結束了。在C語言中,可以通過setbuf來設定無緩衝模式,只要將第二個引數設定為NULL就可以了;也可以通過setvbuf來設定無緩衝模式,其中_IONBF表示行緩衝,就是io not buffer的意思。

相關推薦

LinuxI/O steam緩衝解析

緩衝,快取之類的術語,通常都會和執行效率聯絡到一起,在標準I/O庫中提供緩衝的主要目的就是減少系統函式read和write的呼叫,從而能夠減少系統CPU時間。標準I/O庫的緩衝主要分為3種:全緩衝、行緩衝和不緩衝。 全緩衝 全緩衝就是當輸入或輸出時,當緩衝區

ScalaI/O類使用詳細解析

簡介   在Scala中,I/O操作是呼叫java中的I/O類或者通過對java中的I/O類進行相應的封裝來實現的。    trait FileLogger extends Logger{val fileName:String //PrintWriter使用的是java.io.PrintW

javaI/O的隨機流

隨機流要實現RandomAccessFile這個方法 RandomAccessFile raf = new RandomAccessFile(“D:/IOTest/helloworld.txt”, “

Java I/O : Java的進位制詳解

作者:李強強 上一篇,泥瓦匠基礎地講了下Java I/O : Bit Operation 位運算。這一講,泥瓦匠帶你走進Java中的進位制詳解。 一、引子 在Java世界裡,99%的工作都是處理這高層。那麼二進位制,位元組碼這些會在哪裡用到呢? 自問自答:在跨平臺的時候,就凸顯神功了。比如說檔

網路程式設計I/O複用select的用法

網路程式設計select的用法 select使用流程圖 在網路程式設計中需要新增的程式碼行以及意義 例程 參考文獻及部落格 注:本文對select函式、相關引數及結構體不做解釋 select使用流程

JavaI/O(輸入/輸出)的操作

Java的I/O技術可以將資料儲存到文字檔案、二進位制檔案甚至是ZIP壓縮檔案中,以達到永久性儲存資料的要求。 1、流概述 流是一組有序的資料序列,根據操作的型別,可分為輸入流和輸出流兩種。I/O(Input/Output)流提供了一條通道程式,可以使用這條通道把源中的位元組序列送到目的

i/o 使用字元流 改寫檔案特定部分內容

使用字元流改變特定內容時藉助StringBuffer類中的.toString().replace()方法, BufferedReader(Writer) 可以包裝一個新的其他型別的輸入,輸出流,使用緩衝區提高效率。 //建立字元流 緩衝區

PythonI/O程式設計的select,poll,epoll區別及程式碼例項

select、poll、epoll三者的區別 select select最早於1983年出現在4.2BSD中,它通過一個select()系統呼叫來監視多個檔案描述符的陣列,當select()返回後,該陣列中就緒的檔案描述符便會被核心修改標誌位,使得程序可以獲得這些檔案描述符從而進行後續的讀寫操作。select

Linux——標準I/O以及管道

run 克服 標準 ech 習慣 進程間 nsf lin sof 標準I/O以及管道目錄一、什麽是I/O二、什麽是管道三、三種I/O設備四、把I/O輸出錯誤重定向入文件五、tr六、從文件中導入STDIN七、使用管道鏈接命令八、tee一、什麽是I/O I/O(input

C標準庫I/OLinux檔案I/O

I/O分類:     有兩種I/O,一是檔案I/O,而我們c語言的封裝叫標準I/O,他們有什麼區別那?顯然標準I/O是基於檔案I/O的,標準IO呼叫了檔案IO,也優化了檔案IO,例如引入快取機制。     所以C標準

Linux 高階I/O函式

文章目錄 1. pip函式 2. dup 和 dup2 函式 3. readv 函式和 writev 函式 4. sendfile 函式 5. splice 函式 6. tee 函式 7.

Linux通用I/O模型

學習Linux系統程式設計,檔案I/O是一個不錯的切入點。首先,日常操作中或多或少都使用過檔案,有一定的概念;其次,檔案I/O可以由幾個最最基礎的系統呼叫完成,降低入門理解難度。 基礎系統呼叫 Linux下I/O操作是通用化的,不僅僅可以用來操作檔案輸入輸出,還可以用來操作管道、FIFO、s

第四十四講 I/O流——字元緩衝流的原理

上一講中已經介紹完了字元流的兩個緩衝區物件——BufferedWriter和BufferedReader,而緩衝區的原理我們並沒搞明白,本文就來揭示其真正面目。 緩衝區的原理 臨時儲存資料,減少了對裝置操作的頻率,提高了效率,其實就是將資料臨時快取到了記憶體(陣列)中。 Bu

LinuxI/O多路複用

五種IO模型     阻塞IO(等待魚上鉤)         在核心將資料準備好之前,系統呼叫會一直等待,所有的套接字,預設是阻塞模式。         等待,拷貝資料到buf中,(等待的時間長)     非阻塞IO(定期檢視是否有魚上鉤)         如果核心還未將資料

linuxI/O複用與epoll實際使用(二)

上一節《linux下I/O複用與epoll實際使用(一)》主要講解了epoll的原理,這一節結合socket的程式設計,詳解select與epoll程式設計示例。 一、socket程式設計 在TCP/IP協議中“IP地址+TCP或者UDP埠號”唯一標識網路通訊中

java之I/O輸入輸出流解析

一、流的概述 流是一組有序的資料序列,根據操作的型別,可以分為輸入流和輸出流。I/O流提供了一條通道程式,可以使用這條通道把源中的位元組序列送到目的地。 二、輸入模式 輸出模式圖 三、java流的分類

LinuxI/O多路複用總結

 select,poll,epoll都是IO多路複用的機制。I/O多路複用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。但select,poll,epoll本質上都是同步I/O,因為他們都需要在讀寫事件

緩衝I/O與非緩衝I/O(fopen與open系列函式區別)

在程式中,對於檔案的讀寫,程式執行時間主要消耗在I/O上。與讀寫記憶體相比,讀寫硬碟上的檔案慢很多;每次讀取/寫入檔案的內容很少的話,那麼程式執行時間主要消耗在I/O上了。因此有了緩衝I/O和非緩衝I

Linux 網路 I/O 模型簡介(圖文)

1、介紹     Linux 的核心將所有外部裝置都看做一個檔案來操作(一切皆檔案),對一個檔案的讀寫操作會呼叫核心提供的系統命令,返回一個file descriptor(fd,檔案描述符)。而對一個socket的讀寫也會有響應的描述符,稱為socket fd(soc

linux常用I/O排程演算法及更改

I/O    任何計算機程式都是為了執行一個特定的任務,有了輸入,使用者才能告訴計算機程式所需的資訊,有了輸出,程式執行後才能告訴使用者任務的結果。輸入是Input,輸出是Output,因此,我們把輸入輸出統稱為Input/Output,或者簡寫為IO。