如何连续刷新屏幕并实时更新

GP0*_*007 21 c linux terminal

我想在linux上编写一个C程序,它不断刷新屏幕并实时更新(例如,类似于top终端中的命令).任何人都可以指出我正确的方向.

jma*_*man 30

要使它在终端类型之间保持可移植性,您需要使用诸如ncurses之类的库.查看该链接,这是一个详尽的教程.

这是一个基本程序,它在屏幕的左上角打印一个不断增加的数字:

#include <stdio.h>
#include <ncurses.h>

int main (void)

{
        /* compile with gcc -lncurses file.c */
        int c = 0;
        /* Init ncurses mode */
        initscr ();
        /* Hide cursor */
        curs_set (0);
        while (c < 1000) {
                /* Print at row 0, col 0 */
                mvprintw (0, 0, "%d", c++);
                refresh ();
                sleep (1);
        }
        /* End ncurses mode */
        endwin();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

这就是你如何刷新窗口.现在,如果要像这样显示数据行,则显示的数据top需要维护在有序的数据结构中(取决于您的数据,它可能像数组或链表一样简单).你必须根据你的逻辑指令对数据进行排序,并在a clear()或之后重新写入窗口(如上例所示)wclear().


小智 7

Ncurses可能是最佳选择.既然你说程序,那么ncurses,c,c ++.仔细研究所有这些.但是如果你打算做一些与"shelL"相关的东西,请选择perl.

编辑:添加到我的观点,这里有一些模块可以给你一个想法.

http://metacpan.org/pod/Curses::UI::Dialog::Progress

http://metacpan.org/pod/Smart::Comments

window.clrtobot()
Run Code Online (Sandbox Code Playgroud)

并且为了更好的衡量,呼吁诅咒清除整个窗口.


Dav*_*eri 7

如果您不足xtermVT100兼容,您可以使用控制台代码,例如:

#include <stdio.h>
#include <unistd.h> /* for sleep */

#define update() printf("\033[H\033[J")
#define gotoxy(x, y) printf("\033[%d;%dH", x, y)

int main(void)
{
    update();
    puts("Hello");
    puts("Line 2");
    sleep(2);
    gotoxy(0, 0);
    puts("Line 1");
    sleep(2);
    return(0);
}
Run Code Online (Sandbox Code Playgroud)

您可以使用转义序列执行几乎所有操作,但正如维基百科中所指出的:ncurses优化屏幕更改,以减少使用远程shell时遇到的延迟.


Tho*_*thy 5

正如其他人所说,您可能想查看 ncurses 库。但如果您不需要高级格式,也许像这样的简单操作就足够了:

#include <stdio.h>
#include <unistd.h>

int main(void) {
    int number = 0;
    while (1) {
        ++number;
        printf("\rThe number is now %d.", number);
        fflush(stdout);
        sleep(1);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

根据您的具体情况,您可以在命令行上使用"watch"命令来获取顶部的快速视图.您还可以同时观看多个命令.

例如:

watch 'ls -l <somefile>; ps -fC <someprocess>; ./some_script'
Run Code Online (Sandbox Code Playgroud)