Linux中輸入輸出緩衝區的重新整理
阿新 • • 發佈:2019-01-09
我們知道printf()函式有buff緩衝區,但是這個緩衝區是怎麼工作的呢。
其實我們程式有scanf或gets等這種輸入函式的時候,有沒有發現,當我們輸入字串等資料在視窗的時候,並不會立馬輸出我們的字元,需要我們繼續按下回車或別的與字串無關的操作才能使字串列印至螢幕。
這就是因為這些輸入函式(scanf,gets等)擁有輸入緩衝區。類似printf和puts的輸出函式也有輸出緩衝區。
例如下面的函式:
int main() { printf(“hello”); sleep(5); printf(“world\n”); exit(0); }
此函式就不會立馬列印hello,而是等待5秒後出現helloworld,這就是輸出緩衝區在作用。
當printf讀進字串的時候,並不會馬上列印,而是先儲存在buff裡面,當遇到下面4種條件的時候才進行列印:
1、程式結束 return 0; 或 exit(0);
2、遇到”\n”
3、主動重新整理 fflush(stdout);
4、緩衝區滿
所以,hello只是被儲存在了緩衝區裡,沒有遇到上面條件的一種,這就是為什麼會先等待,後出現helloworld。
當在第一個printf里加入”\n”,之後就會先列印hello,之後等待5秒,換行繼續列印world
ps:為什麼要引入緩衝區,是因為進行使用者態和核心態的切換過於麻煩,引入緩衝區可以使系統更加有效率的執行,具體內容可以參考系統呼叫與檔案操作。