TOP >> マニアックなプログラミング
トリッキーコードネット トリッキーなコード

【C言語】Linuxでのkbhit関数(キーイベントの取得)

Linux環境でのC言語開発で、Windowsでいうところの kbhit関数(キーイベントの取得) を再現したコードです。
(※ 英語サイトに転がっていたソースに、一部修正を加えたものです。)

・・・いずれ使うかもしれないので、メモがてら置いておきます^^;)

int kbhit(void) { struct termios oldt, newt; int ch; int oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if (ch != EOF) { ungetc(ch, stdin); return 1; } return 0; }
使い方)
#include <stdio.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> int kbhit(void) { struct termios oldt, newt; int ch; int oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if (ch != EOF) { ungetc(ch, stdin); return 1; } return 0; } int main(void) { puts("何かキーを押したら終了します。"); while (1) { if (kbhit()) { printf("'%c'を押しました。\n", getchar()); break; } } return 0; }

ひょっとしたら参考になるかもしれないページ : kbhit関数について(Windows)
トリッキーコードネット の TOPへ HOTNEWS の 総合TOPへ