ホームページ  >  記事  >  バックエンド開発  >  Linux でノンブロッキングのキーボード入力を実現する方法: kbhit() と getch() の同等物へのガイド

Linux でノンブロッキングのキーボード入力を実現する方法: kbhit() と getch() の同等物へのガイド

Susan Sarandon
Susan Sarandonオリジナル
2024-10-29 01:11:30675ブラウズ

How to Achieve Non-Blocking Keyboard Input in Linux: A Guide to kbhit() and getch() Equivalents

kbhit() と getch() に相当するものを使用した Linux でのキーボード入力へのアクセス

提供された Windows コードは、プラットフォーム固有の関数 _kbhit( ) と _getch() を使用して、プログラムのループを中断せずにキーボード入力を監視します。ただし、これらの関数は Linux システムでは使用できないため、代替アプローチが必要です。

POSIX 準拠の kbhit() 同等

Linux システムに conio.h ヘッダーがない場合kbhit() をサポートしている場合は、Morgan Mattews の実装を活用することを検討してください。このソリューションは、任意の POSIX 準拠システム上で kbhit() 機能をエミュレートします。

getchar() の問題の解決

termios レベルでバッファリングを非アクティブ化すると、kbhit() の問題だけが解決されるわけではありません。この問題だけでなく、提供されているリソースで示されているように、getchar() に関連する問題にも対処します。このアプローチにより、Enter キーの押下を待たずに入力が即座に受信されるようになります。

サンプル コードとの統合

提供されたサンプル コードを Linux システムに適応させるには、_kbhit を置き換えることを検討してください。 () および _getch() と、POSIX 準拠の同等のもの。以下の修正されたコードは、この統合を示しています。

<code class="cpp">#include <termios.h>
#include <unistd.h>
#include <iostream>

int main()
{
    // Disable input buffering
    termios oldt, newt;
    tcgetattr(STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);

    while (true)
    {
        if (kbhit())
        {
            char c = getchar();
            if (c == 'g')
            {
                std::cout << "You pressed G" << std::endl;
            }
        }
        sleep(500);
        std::cout << "Running" << std::endl;
    }

    // Restore input buffering
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

    return 0;
}</code>

この修正されたコードは、Mattews の kbhit() 実装を利用し、入力バッファリングを無効にして、元の Windows コードと同様の機能を実現します。

以上がLinux でノンブロッキングのキーボード入力を実現する方法: kbhit() と getch() の同等物へのガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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