在printf的實(shí)現(xiàn)中有一步調(diào)用write的操作。而write是一個(gè)系統(tǒng)調(diào)用,系統(tǒng)調(diào)用是軟中斷,頻繁調(diào)用會(huì)使內(nèi)核頻繁陷入內(nèi)核態(tài),效率不是很高,所以printf的實(shí)現(xiàn)中在調(diào)用write之前,加了一個(gè)IO緩沖區(qū)。printf輸出數(shù)據(jù)的時(shí)候?qū)嶋H上是先往用戶空間的IO緩沖區(qū)寫,在滿足條件的情況下才會(huì)調(diào)用write并且刷新緩沖區(qū),這樣會(huì)提高內(nèi)核工作的效率。 滿足條件的情況有以下幾種:
緩沖區(qū)填滿;寫入的字符中有‘/n’;調(diào)用fflush函數(shù)手動(dòng)刷新緩沖區(qū);調(diào)用scanf要從緩沖區(qū)中讀數(shù)據(jù)時(shí),也會(huì)將緩沖區(qū)的數(shù)據(jù)刷新;printf語句生命結(jié)束時(shí);滿足上面任意一個(gè)條件,緩沖區(qū)都會(huì)進(jìn)行刷新,然后將數(shù)據(jù)輸出至屏幕。緩沖區(qū)的大小一般為1024bytes,我們進(jìn)度條的實(shí)現(xiàn)最多輸出不到150個(gè)字符而且后面還不能加‘/n’換行符。所以我們只能在每次printf后面調(diào)用fflush手動(dòng)刷新IO緩沖區(qū),以達(dá)到在sleep之前輸出printf內(nèi)容的目的。

如上圖所示,該輸出結(jié)果的3秒后才輸出 hehe

修改后 正常瞬間輸出
4:思考 我們以一個(gè)字符數(shù)組 str [101] 作為被填充體, 以' # '作為填充物,數(shù)組的最后一個(gè)元素為 ' /0 ',一個(gè)' # '表示完成進(jìn)度條的1 %,每一個(gè)進(jìn)度條得提升,我們就輸出一次字符數(shù)組,再利用回車的特性,綜合循環(huán)結(jié)構(gòu)便可以完成這個(gè)代碼#include<stdio.h>#include <unistd.h>int main(){ int i = 0; char str[101]; char arr[5] = "-//|/"; str[0] = '/0'; while(i < 100) { str[i++] = '#'; str[i] = '/0'; printf("[%-100s][%%%d][%c]/r",str,i,arr[i%4]); fflush(stdout); usleep(50000); } printf("/n");}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注