ホームページ  >  記事  >  バックエンド開発  >  Linux で入力を処理する方法: kbhit() と getch() の代替案?

Linux で入力を処理する方法: kbhit() と getch() の代替案?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 05:43:30470ブラウズ

How to Handle Input in Linux: An Alternative to kbhit() and getch()?

Linux での入力処理: kbhit() および getch() の代替

Windows では、_kbhit() および _getch() 関数プログラムを停止せずにキーボード入力をチェックする簡単な方法を提供します。ただし、これらの機能は Linux では使用できません。この記事では、Linux で入力を処理するための代替アプローチを検討します。

Morgan Mattews のコード

1 つの解決策は、Morgan Mattews によって提供されるコードを利用することです。このコードは、次の機能をエミュレートします。 _kbhit() を POSIX 準拠の方法で実行します。これには、termios レベルでのバッファリングの非アクティブ化が含まれます。

getchar() の問題

termios バッファリングを無効にすると、_kbhit() の不在に対処するだけでなく、getchar() の問題にも対処できます。入力バッファリングを防止します。

<code class="c">#include <stdio.h>
#include <termios.h>

int kbhit() {
    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() {
    while (true) {
        if (kbhit()) {
            char c = getchar();
            if (c == 'g') {
                printf("You pressed G\n");
            }
        }
        printf("Running\n");
        sleep(1);
    }

    return 0;
}</code>

以上がLinux で入力を処理する方法: kbhit() と getch() の代替案?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。