Heim  >  Artikel  >  Backend-Entwicklung  >  So erreichen Sie eine nicht blockierende Tastatureingabe unter Linux: Eine Anleitung zu kbhit()- und getch()-Äquivalenten

So erreichen Sie eine nicht blockierende Tastatureingabe unter Linux: Eine Anleitung zu kbhit()- und getch()-Äquivalenten

Susan Sarandon
Susan SarandonOriginal
2024-10-29 01:11:30675Durchsuche

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

Zugriff auf Tastatureingaben unter Linux mit kbhit()- und getch()-Äquivalenten

Der bereitgestellte Windows-Code nutzt die plattformspezifischen Funktionen _kbhit( ) und _getch(), um Tastatureingaben zu überwachen, ohne die Programmschleife zu unterbrechen. Diese Funktionen sind jedoch auf Linux-Systemen nicht verfügbar, sodass alternative Ansätze erforderlich sind.

POSIX-kompatibles kbhit()-Äquivalent

Wenn Ihrem Linux-System ein conio.h-Header fehlt Wenn Sie kbhit() unterstützen, sollten Sie erwägen, die Implementierung von Morgan Mattews zu nutzen. Diese Lösung emuliert die kbhit()-Funktionalität auf jedem POSIX-kompatiblen System.

Beheben von getchar()-Problemen

Das Deaktivieren der Pufferung auf Termios-Ebene löst nicht nur kbhit() Problem, sondern geht auch auf alle Bedenken im Zusammenhang mit getchar() ein, wie in der bereitgestellten Ressource gezeigt. Dieser Ansatz stellt sicher, dass Eingaben sofort empfangen werden, ohne auf den Tastendruck der Eingabetaste zu warten.

Integration mit Beispielcode

Um den bereitgestellten Beispielcode an Linux-Systeme anzupassen, sollten Sie _kbhit ersetzen () und _getch() mit ihren POSIX-kompatiblen Entsprechungen. Der folgende überarbeitete Code demonstriert diese Integration:

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

Dieser modifizierte Code nutzt die kbhit()-Implementierung von Mattews und deaktiviert die Eingabepufferung, um eine ähnliche Funktionalität wie der ursprüngliche Windows-Code zu erreichen.

Das obige ist der detaillierte Inhalt vonSo erreichen Sie eine nicht blockierende Tastatureingabe unter Linux: Eine Anleitung zu kbhit()- und getch()-Äquivalenten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn