「特定のキーを押したらプロセスを終了する」という処理を作りたい!
ということで、キー割り込みの処理についてです。
キーボードを押した判定
Windowsのconio.hには、kbhit()という関数がありますが、Linuxにはコレがないようです。
なので調べていたら、このようなコードがありました。
// 引用: https://hotnews8.net/programming/tricky-code/c-code03 #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; }
あるキーが押されたか?判定
コレを使ってqが押されたらTRUEを返すコードをを作ります。
// check key interrupt int isInterrupt() { if ( kbhit() ) { if ( getchar() == 'q' ) { return 1; } } return 0; }
キーが押されたらループを抜ける
あるキーを押されたらループを抜けるようなプロセス。
void process1() { printf("** Porcess start\n"); if (fork() == 0) { for (;;) { // *** 処理 *** // 特定のキーが押されたら終了 if (isInterrupt()) { break; // プロセス終了 } } printf("** Process end\n"); exit(EXIT_SUCCESS); } } int main() { process(); // 子プロセスの起動 return 0; }
キーイベントみたいなこともできる
isInterrupt()は「あるキーが押されたか?」だけを判定していましたが、同じように複数書けばキーごとのイベント分岐も作れます。
例えばこんな感じ。
// check key interrupt int main(void) { while(1) { if ( kbhit() ) { if ( getchar() == 'a' ) { // 処理A } else if ( getchar() == 'b' ) { // 処理B } else if ( getchar() == 'c' ) { // 処理C } else if ( getchar() == 'q' ) { // 終了 break; } } } return 0; }
参考
コチラを参考にしました。ありがとうございました!
あとがき
C言語でキー割り込みを作る!でした!
別で作成したプロセスでも効くので、結構便利です。
押したら終了とか、ちょっとしたメニューを作るのにいい感じなので、よければ参考にしてください!