1. 程式人生 > >Linux下標準I/O緩衝機制

Linux下標準I/O緩衝機制

平臺:Ubuntu作業系統

編譯器:g++

首先讓我們看一段程式碼:

#include <iostream>
#include <unistd.h>
using namespace std;


int main()
{
	for (int i = 0; i < 3; ++i)
	{
		cout << "hello " << i;	//注意,這裡沒有加換行符
		sleep(1);	//睡眠1秒
	}
}

編譯執行程式,發現終端控制檯並未立即列印任何東西,直到3秒以後才突然全部打印出來!

為什麼會這樣?其實是Linux系統下標準I/O緩衝機制在作怪。在Windows下面未採用此類緩衝機制,故現象不同。

Linux下的標準I/O緩衝機制分為3大類:

  1.  全緩衝。填滿標準I/O緩衝區後才進行實際I/O操作。駐留在磁碟上的檔案通常是由標準I/O庫實施全緩衝。
  2. 行緩衝。遇到換行時才進行實際I/O操作。Linux終端通常使用的是行緩衝。
  3. 無緩衝。不進行緩衝操作。標準出錯流stderr屬於無緩衝。
  • 備註

無論是全緩衝還是行緩衝,當程式顯式呼叫flush方法,或者當程式正常退出時,都會重新整理緩衝區,並將快取內容全部輸出。

示例程式碼如下:

#include <iostream>
#include <unistd.h>
using namespace std;


int main()
{
	for (int i = 0; i < 3; ++i)
	{
		cout << "hello " << i << flush;	//注意,這裡沒有加換行符
		sleep(1);	//睡眠1秒
	}
}

增加了flush控制重新整理之後,程式就會在cout執行後立即打印出類似“hello 1”這樣的字串(總共列印3次,每次間隔1秒),而不需要等待程式結束後才一次性全部列印。

另外,在Linux下面也有相關的方法可以檢視當前緩衝機制屬於全緩衝、行緩衝還是無緩衝,甚至可以檢視緩衝區大小。在本文中就不詳細描述了。