2014年4月15日 星期二

Ncurses

這幾天在寫一支簡單的程式去讀 sch5027 這顆 SuperIO 上的 Hardware Monitor 的資料,並且顯示在螢幕上。之前都是直接用 printf 搭配 while loop 把資料顯示出來,完全就是一個懶人的做法,最近剛好手邊沒什麼工作,所以就試著用 Ncurses 來實做一下。

要使用 Ncurses 的 library,必需要 include curses.h
#include <curses.h>
編譯的時候,要加入 -lncurses
$ gcc -lncurses XYZ.c -o XYZ
所有的 curses 程式都是以 initscr() 開頭,並以 edwin() 結束,要更新畫面,就呼叫 refresh。
#include <ncurses.h>
....
do {
    initscr(); /* must only be called once in each program */
    ....
    /* do something */
    ....
    refresh();
} while (1);

endwin();

如果不想要使用 Ctrl+C 離開程式,則可以選擇從 input 讀取資料來決定要不要離開程式,原本是想要用 getch(),但是 getch() 會 block 住程式,直到 input 有輸入為止,所以改用 select 來避開這個問題。
#include <ncurses.h>
#include <sys/time.h>

....
struct timeval tv;
fd_set readfds;
....
do {
    initscr(); /* must only be called once in each program */
    ....
    /* do something */
    ....
    refresh();
    FD_ZERO(&readfds);
    FD_SET(0, &readfds);
    tv.tv_sec = delay;
    tv.tv_usec = 0;
    if (select(1, &readfds, NULL, NULL, &tv) > 0) {
        if (read(0, &c, 1) != 1)
            break;
        if (c == 'q')
            delay = 0;
    }
} while (delay);

endwin();

procps-3.2.8 - slabtop.c
Waiting for Input or Output
Ncurses Programming Guide
NCURSES Programming HOWTO