ncurses を使用して非常に単純なカウンターを使用すると、次のようになります。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ncurses.h>
int main(void) {
struct timespec start;
clock_gettime(CLOCK_REALTIME, &start);
initscr();
cbreak();
nodelay(stdscr, TRUE);
{
int key = -1;
struct timespec delay, now;
do {
clock_gettime(CLOCK_REALTIME, &delay);
delay.tv_sec = 0;
delay.tv_nsec = 1000L * 1000L * 1000L - delay.tv_nsec;
nanosleep(&delay, NULL);
clock_gettime(CLOCK_REALTIME, &now);
mvprintw(1, 1, "%ld\n", (long)(now.tv_sec - start.tv_sec));
refresh();
key = getch();
if (key >= 0)
break;
} while (now.tv_sec - start.tv_sec < 60);
}
endwin();
return 0;
}
任意のキーを押すと中止されます(OK、cbreak()
使用しているため、特別ctrlなC努力なしで常に機能します...)。
ただし、カウンターを一時停止する関数を追加したり、オンザフライでリセットしたり (+/- 1 秒) するなど、これをより複雑にすることができます。
これには、ノンブロッキングのキーボード入力が絶対に必要です。
Gforthでこれを行うことは可能でしょうか? OK、そこで SIGINT のような割り込みをキャッチする方法は知っていますが、上記のようなものは、任意のキーまたは任意の所定のキーに対して機能しますか?