偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Linux中的軟件安裝進(jìn)度條怎么搞?

系統(tǒng) Linux
我們?cè)谄綍r(shí)的服務(wù)器運(yùn)維工作中,要經(jīng)常安裝一些軟件,經(jīng)常會(huì)看到下面這種進(jìn)度條,本文就用C語言來實(shí)現(xiàn)這種進(jìn)度條。

一、回車與換行

換行是換到下一行的當(dāng)前位置,一般用\n表示?;剀囀腔氐疆?dāng)前行的開始,一般用\r表示。

但一般在語言,比如C語言中,用\n代表換行+回到開始。

二、緩沖區(qū)

先來看兩段代碼及其現(xiàn)象。

第一段代碼,代碼很簡單,主要是為了與第二段形成對(duì)比。

#include <stdio.h>                                                                                          
#include <unistd.h>
int main()
{
printf("I am a proc\n");//有\(zhòng)n
sleep(3);
return 0;
}

先打印,再sleep持續(xù)3秒,很自然的結(jié)果。

第二段代碼:

#include <stdio.h>                                                                                          
#include <unistd.h>
int main()
{
printf("I am a proc");//沒有\(zhòng)n
sleep(3);
return 0;
}

第二段代碼運(yùn)行結(jié)果如下,從結(jié)果看來是先sleep持續(xù)3s,然后才打印。

事實(shí)上,上面的代碼中由于printf在sleep之前,所以printf永遠(yuǎn)先于sleep執(zhí)行,但是先執(zhí)行printf不代表先打印。

printf執(zhí)行后,要打印的內(nèi)容放入緩沖區(qū),但不一定會(huì)被立即刷新到屏幕上。

這里要提一下緩沖區(qū)的3種緩沖策略:

  • 1.無緩沖:數(shù)據(jù)不緩沖,直接打印到外設(shè)中(屏幕、磁盤等等)。
  • 2.行緩沖:先保存一行數(shù)據(jù),后續(xù)刷新時(shí)按行刷新(遇到\n就把前面的內(nèi)容刷新到外設(shè))。
  • 3.全緩沖:直到把緩沖區(qū)全放滿才會(huì)刷新。

再結(jié)合上面兩段代碼及現(xiàn)象,可以得出上面打印時(shí)采用的是行緩沖(遇到\n就把要打印的內(nèi)容打印在屏幕上)。

三、倒計(jì)時(shí)的程序

如果每次打印完都回車,就相當(dāng)于在第一個(gè)位置打印一個(gè)數(shù)字后,又回到該位置,繼續(xù)打印下一個(gè)數(shù)字。這樣就可以實(shí)現(xiàn)倒計(jì)時(shí)的效果。

#include <stdio.h>                                                                                          
#include <unistd.h>
int main()
{
int count = 3;
while(count >= 0)
{
printf("%d\r", count--);
sleep(1);
}
return 0;
}

但結(jié)果如下,并沒有打印結(jié)果,想到行緩沖的規(guī)則,原來是因?yàn)榇蛴〉膬?nèi)容一直都沒有換行,所以內(nèi)容一直存在緩沖區(qū)內(nèi),不會(huì)打印出來。

這里可以用fflush函數(shù)強(qiáng)行讓屏幕刷新,就可以實(shí)現(xiàn)想要的效果了。

使用fflush刷新stdout(即屏幕的文件流),使每次進(jìn)入緩沖區(qū)的內(nèi)容被立即打印出來。

#include <stdio.h>                                                                                          
#include <unistd.h>
int main()
{
int count = 3;
while(count >= 0)
{
printf("%d\r", count--);
fflush(stdout);
sleep(1);
}
return 0;
}

效果如下

但如果是兩位或更多位的倒計(jì)時(shí),就會(huì)出現(xiàn)如下的問題:

#include <stdio.h>                                                                                          
#include <unistd.h>
int main()
{
int count = 10;
while(count >= 0)
{
printf("%d\r", count--);
fflush(stdout);
sleep(1);
}
return 0;
}

因?yàn)槊看位剀嚩蓟氐降谝粋€(gè)字符,所以第二位的0一直沒有改變。

只需用printf的格式控制即可。

#include <stdio.h>                                                                                          
#include <unistd.h>
int main()
{
int count = 10;
while(count >= 0)
{
//控制輸出兩位字符
printf("%2d\r", count--);
fflush(stdout);
sleep(1);
}
return 0;
}

運(yùn)行效果如下:

四、進(jìn)度條程序

#include <stdio.h>    
#include <string.h>
#include <unistd.h>
void ProcBar()
{
int i = 0;
char proc[102];
memset(proc, '\0', sizeof(proc));
while(i <= 100)
{
//C語言格式控制時(shí)默認(rèn)右對(duì)齊,所以要在前面加-變成左對(duì)齊
printf("[%-100s] [%d%%]\r", proc, i);
fflush(stdout);//刷新屏幕打印
proc[i] = '#';
usleep(100000);//以微秒為單位的sleep
i++;
}
printf("\n");
}
int main()
{
ProcBar();
return 0;
}

責(zé)任編輯:龐桂玉 來源: 馬哥Linux運(yùn)維
相關(guān)推薦

2015-07-31 11:19:43

數(shù)字進(jìn)度條源碼

2015-01-12 12:13:03

Android進(jìn)度條ProgressDia

2015-01-12 09:30:54

Android進(jìn)度條ProgressDia

2024-07-25 08:55:47

進(jìn)度條水缸進(jìn)度動(dòng)畫效果

2012-07-31 09:53:33

HTML5進(jìn)度條

2015-09-06 09:50:59

創(chuàng)業(yè)大數(shù)據(jù)

2011-07-05 15:16:00

QT 進(jìn)度條

2024-08-06 14:29:37

2009-04-24 08:26:02

Mobile Mark移動(dòng)OS

2013-03-12 10:35:06

CSS 3

2015-08-03 11:39:20

擬物化進(jìn)度條

2024-12-02 09:37:51

2012-01-17 13:58:17

JavaSwing

2023-12-11 17:15:05

應(yīng)用開發(fā)波紋進(jìn)度條ArkUI

2009-06-06 18:54:02

JSP編程進(jìn)度條

2024-06-13 08:15:00

2020-11-02 18:27:29

進(jìn)度條Linuxcp

2016-05-06 08:08:29

2023-03-06 07:25:17

LinuxAdvanced

2009-08-17 14:41:47

C#進(jìn)度條實(shí)現(xiàn)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)