標準輸出設備
我們知道C語言中,printf函式是將程式運行后要輸出的內容在顯示幕中顯示,也就是將內容列印到輸出設備顯示幕上,然而在Linux中有一個重要的概念就是Linux系統下一切皆檔案,也就是說在Linux中,把顯示幕當做檔案型別進行操作,資料才能夠被列印到顯示幕上,其中,列印到顯示幕被稱為標準輸出設備,
列印的內容是如何顯示到顯示幕上的
其實當我們每次要列印資料時,并不是將資料直接發送給標準輸出設備,也就是并直接發送給顯示幕,而是將要列印的資料先存放到緩沖區,當緩沖區資料滿時,或者程式結束時,或者手動重繪緩沖區時,緩沖區才會把資料傳輸到標準輸出設備中,也就是顯示幕中進行輸出,
為什么要有緩沖區
每一個檔案都有自己的緩沖區,在程式結束的時候緩沖區內的程式會被全部釋放,
將要列印的資料先存放到緩沖區中,然后在滿足下面三個條件之一的時候:1.緩沖區資料滿時; 2.程式結束時;3.手動重繪緩沖區時,再講資料一次性傳輸到標準輸出設備,這樣的好處是:減少IO設備的操作,
如果沒有緩沖區,每一次要將資料輸出到顯示幕上,就要進行一次的IO操作,會降低IOx效率,如果現將所有要輸出的資料存到緩沖區中,然后一次性傳輸給顯示幕,就會大大的提高IO效率,
通過代碼理解
#include<stdio.h>
#include<unistd.h>
int main ()
{
char buf[11] = {0};
for (int i =0; i < 10; i++)
{ buf[i]='——';
printf("%s",buf);
usleep(100000); //讓程式沒執行一次回圈休眠一段時間,便于觀察
}
return 0;
}
運行這段程式,我們會發現代碼會發現,輸出的時候并沒有像我們想象的那樣,先列印一個‘—’,間隔一段時間再列印‘— —’,而是在短暫的停頓后一次性輸出一串‘—’,這就是因為printf函式把要輸出的所有資料都存盤到了緩沖區,在程式結束后一次性將緩沖區的資料傳給的標準輸出設備進行列印,

但是標準輸出檔案的緩沖區有一個特性:換行重繪緩沖區,
所以我們將代碼進行一下修改
printf("%s",buf);
//改為
printf("%s\n",buf);
程式運行后就會發現 ‘—’ 會像我們預想的那樣,每進行一次回圈,輸出后,間隔一段時間,再繼續輸出下一次,

在C語言中也有專門進行重繪緩沖區的指令,我們將代碼進行修改
#include<stdio.h>
#include<unistd.h>
int main ()
{
char buf[11] = {0};
for (int i =0; i < 10; i++)
{ buf[i]='——';
printf("%s",buf);
usleep(100000); //讓程式沒執行一次回圈休眠一段時間,便于觀察
fflush(stdout); //重繪緩沖區
}
return 0;
}
運行這個程式會發現,我們并沒有使用 \n 換行來進行重繪緩沖區,而是手動的使用 fflush 來重繪緩沖區,也可以實作每執行一次回圈讓程式休眠一段時間,再進行下一次輸出,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272340.html
標籤:其他
