lisz-works

技術と興味の集合体

C言語でキー割り込みを作る

【スポンサーリンク】

プログラムのソースコード

「特定のキーを押したらプロセスを終了する」という処理を作りたい!

ということで、キー割り込みの処理についてです。

キーボードを押した判定

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;
}

参考

コチラを参考にしました。ありがとうございました!

hotnews8.net

あとがき

C言語でキー割り込みを作る!でした!

別で作成したプロセスでも効くので、結構便利です。

押したら終了とか、ちょっとしたメニューを作るのにいい感じなので、よければ参考にしてください!