Maison  >  Article  >  développement back-end  >  Comment gérer les entrées sous Linux : une alternative à kbhit() et getch() ?

Comment gérer les entrées sous Linux : une alternative à kbhit() et getch() ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 05:43:30470parcourir

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

Gestion des entrées sous Linux : une alternative à kbhit() et getch()

Sous Windows, fonctions _kbhit() et _getch() fournit un moyen simple de vérifier la saisie au clavier sans arrêter le programme. Cependant, ces fonctions ne sont pas disponibles sous Linux. Cet article explore une approche alternative pour gérer les entrées sous Linux.

Code de Morgan Mattews

Une solution consiste à utiliser le code fourni par Morgan Mattews, qui émule la fonctionnalité de _kbhit() d'une manière conforme à POSIX. Cela implique de désactiver la mise en mémoire tampon au niveau termios.

Problème getchar()

La désactivation de la mise en mémoire tampon termios résout non seulement l'absence de _kbhit() mais résout également le problème getchar() en empêchant la mise en mémoire tampon des entrées.

Exemple

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn