成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux中的軟件安裝進度條怎么搞?

系統 Linux
我們在平時的服務器運維工作中,要經常安裝一些軟件,經常會看到下面這種進度條,本文就用C語言來實現這種進度條。

一、回車與換行

換行是換到下一行的當前位置,一般用\n表示。回車是回到當前行的開始,一般用\r表示。

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

二、緩沖區

先來看兩段代碼及其現象。

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

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

先打印,再sleep持續3秒,很自然的結果。

第二段代碼:

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

第二段代碼運行結果如下,從結果看來是先sleep持續3s,然后才打印。

事實上,上面的代碼中由于printf在sleep之前,所以printf永遠先于sleep執行,但是先執行printf不代表先打印。

printf執行后,要打印的內容放入緩沖區,但不一定會被立即刷新到屏幕上。

這里要提一下緩沖區的3種緩沖策略:

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

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

三、倒計時的程序

如果每次打印完都回車,就相當于在第一個位置打印一個數字后,又回到該位置,繼續打印下一個數字。這樣就可以實現倒計時的效果。

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

但結果如下,并沒有打印結果,想到行緩沖的規則,原來是因為打印的內容一直都沒有換行,所以內容一直存在緩沖區內,不會打印出來。

這里可以用fflush函數強行讓屏幕刷新,就可以實現想要的效果了。

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

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

效果如下

但如果是兩位或更多位的倒計時,就會出現如下的問題:

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

因為每次回車都回到第一個字符,所以第二位的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;
}

運行效果如下:

四、進度條程序

#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語言格式控制時默認右對齊,所以要在前面加-變成左對齊
printf("[%-100s] [%d%%]\r", proc, i);
fflush(stdout);//刷新屏幕打印
proc[i] = '#';
usleep(100000);//以微秒為單位的sleep
i++;
}
printf("\n");
}
int main()
{
ProcBar();
return 0;
}

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2015-07-31 11:19:43

數字進度條源碼

2015-01-12 12:13:03

Android進度條ProgressDia

2015-01-12 09:30:54

Android進度條ProgressDia

2024-07-25 08:55:47

進度條水缸進度動畫效果

2012-07-31 09:53:33

HTML5進度條

2015-09-06 09:50:59

創業大數據

2011-07-05 15:16:00

QT 進度條

2024-08-06 14:29:37

2009-04-24 08:26:02

Mobile Mark移動OS

2013-03-12 10:35:06

CSS 3

2024-12-02 09:37:51

2015-08-03 11:39:20

擬物化進度條

2012-01-17 13:58:17

JavaSwing

2023-12-11 17:15:05

應用開發波紋進度條ArkUI

2009-06-06 18:54:02

JSP編程進度條

2016-05-06 08:08:29

2024-06-13 08:15:00

2020-11-02 18:27:29

進度條Linuxcp

2023-03-06 07:25:17

LinuxAdvanced

2009-08-17 14:41:47

C#進度條實現
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区三区精品 | 精品国产久 | 国产福利网站 | 一二三四av | 久久久久国产一区二区三区不卡 | 久久日韩精品一区二区三区 | 伊人伊人 | 亚洲永久入口 | 精品少妇一区二区三区日产乱码 | 一区二区三区国产 | 日本成人在线观看网站 | 国产一级特黄真人毛片 | 日韩久久在线 | 欧美午夜精品久久久久久浪潮 | 九九久久久 | 亚洲日韩第一页 | 日韩1区 | 成人久久久 | www.玖玖玖 | 国产一区视频在线 | 天天噜天天干 | 久久国产精品色av免费观看 | 国产成人精品一区二区三区在线观看 | 国产精品视频网 | 青娱乐国产 | 日本一区二区三区四区 | 亚洲精品一区在线 | 欧美激情国产日韩精品一区18 | 欧美精品一区二区在线观看 | www狠狠爱com| 综合网在线 | 草草视频在线播放 | www.亚洲.com | 网站黄色在线免费观看 | 午夜久久久| 婷婷免费视频 | 亚洲精品视频免费观看 | 97国产在线观看 | 欧美一级电影免费 | 在线观看国产视频 | 精品91|