[討論] Docker的字串顯示處理是怎麼做出來的?

作者: InvincibleK (我是無敵的K)   2019-08-28 10:19:19
docker pulling images的時候:
Using default tag:latest
latest:Pulling from library/ubuntu
fd2731e4c50c: Downloading [===========> ]
28a2f68d1120: Pull complete
a3ed95caeb02: Pull complete
...
在同一行,文字顯示會有動畫的效果,
如:
Downloading [===========> ]
完成後,
同一行變成:
28a2f68d1120: Pull complete
印象中,
很古早的時代,
Unix Terminal/ Windows DOS早就存在這種效果.
所以docker這個顯示部份,很有可能是用C語言寫的.
想請問大大們,
這是怎麼寫出來的?
iostream好像沒有這類functions?
作者: jerryh001   2019-08-28 10:24:00
直接蓋掉那一行
作者: CP64 (( ̄▽ ̄#)﹏﹏)   2019-08-28 11:54:00
基本上是用 ansi escape sequence 來移動游標跟蓋掉重畫的
作者: a58524andy (a58524andy)   2019-08-28 12:22:00
cout << '\b' << flush
作者: eddie55020 (eddie)   2019-08-28 20:02:00
ncurses?
作者: firejox (Tangent)   2019-08-28 20:30:00
ncurses
作者: InvincibleK (我是無敵的K)   2019-08-29 16:43:00
我就在想純C不太可能,果然是C++來的~
作者: eddie55020 (eddie)   2019-08-29 16:51:00
純c可以啊,上面那個'\b'只是ASCII code而已ncurses也是c的庫
作者: LPH66 (-6.2598534e+18f)   2019-08-29 16:53:00
其實 \b \r 的機制和 <ncurses.h> 的機制是不一樣的<ncurses.h> 會需要平台支援, 但能控制的範圍就很大\b \r 則是這些 ascii 字元古早以前的意義轉義到螢幕顯示上所以其控制範圍只有當年的行控制而已至於 ansi escape sequence 也是要看平台支援
作者: james732 (好人超)   2019-08-29 17:01:00
C就用 printf("%c", '\b'); 也是一樣的
作者: lantw44 (#######################)   2019-08-30 22:44:00
Docker 是 Go 寫的吧?從 pkg/jsonmessage 看起來是這個https://github.com/morikuni/aec只用 \b 和 \r 應該沒辦法像 Docker 那樣退回上一行

Links booklink

Contact Us: admin [ a t ] ucptt.com