Forum: PC-Programmierung C, Linux: Tastatur-Puffer abfragen?


von tipper (Gast)


Lesenswert?

Wie kann ich in meiner Konsolenanwendung feststellen, ob (eine) Taste(n)
gedrückt wurde(n)?

von Nils (Gast)


Lesenswert?

Ich hatte kbhit() im Sinn, aber das schein unter UNIX nicht zu gehen:

http://www.ohse.de/uwe/articles/kbhit.html

von tipper (Gast)


Lesenswert?

Möglicherweise ist getch() die Lösung, aber die Funktion kommt wohl
Ursprünglich vom DOS..? Vielleicht habe ich ja Glück..

Hier mal ein Link:

http://www.pronix.de/pronix-783.html

von SiO2 (Gast)


Lesenswert?

getch() aus der ncurses lib.

von tipper (Gast)


Lesenswert?

Danke!

Warum benötigt

  printw("Press any key to end program\n");

  nodelay(stdscr, FALSE);
  getch();
  endwin();

  printf("Program successfully terminated. Thank you.\n\n");

  return EXIT_SUCCESS;
}

3 Zeichen, um zu funktionieren? Die beiden letzten sind dann noch auf
der Konsole zu sehen. Hat das was mit der Erkennung von Sondertasten zu
tun?

Danke!

von tipper (Gast)


Lesenswert?

so, wie so oft, problem ist weg, und ich weiß nicht wieso. gut?

von -Daniel- (Gast)


Lesenswert?

hallo,

schaue dir tcsetattr, tcgetattr
tc steht für terminal control
damit sind viele Dinge möglich, zb Abschalten von Echo
damit man passwort eingeben kann usw
(kann bei bedarf Stück Code posten)

ich weiss nicht ob diese Funktionen in libc sind
aber immerhin bekommt ihr keine Abhängigkeit
ncurses dazulinken zu müssen

Grüsse, Daniel

von Nico S. (Gast)


Lesenswert?

Auja, bitte einmal das Stückchen Code posten.

Danke im Voraus,
Nico

von anaktai (Gast)


Lesenswert?

Moin,

Du kannst auch einfach /dev/tty mit fopen (dem Derivat deiner Wahl)
öffnen und ein Zeichen lesen. Dort wird die aktuelle Konsole (bzw. das
jeweilige tty) hingelegt.

MfG

von -daniel- (Gast)


Lesenswert?

zuerst Beispiel echo abschalten
////////////////////////////////////////
cat echo.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <signal.h>

struct termios term_attr;
int old_flags;

void restore()
{
    term_attr.c_lflag = old_flags;
    tcsetattr(0 /* STDIN */, TCSAFLUSH, &term_attr);
    exit(100);
}

int main()
{
    char passwd[20];
    if(tcgetattr(0, &term_attr) != 0)
        return 1;
    old_flags = term_attr.c_lflag;
    term_attr.c_lflag &= ~ECHO;
    if(tcsetattr(0, TCSAFLUSH, &term_attr) != 0)
        return 2;
    printf("Password: ");
    printf("%s", fgets(passwd, 20, stdin));
    signal(SIGINT, restore);
    while(1)
        sleep(2);
    return EXIT_SUCCESS;
}
////////////////////////////////////////


und jetzt beispiel mit Einlesen von Zeichen ohne Return
drücken zu müssen

////////////////////////////////////////////////////
cat term1.c
#include <stdlib.h>
#include <stdio.h>
#include <termios.h>
#include <string.h>
#include <signal.h>

static struct termios stored_settings;

void set_keypress(void)
{
    struct termios new_settings;
    tcgetattr(0,&stored_settings);
    new_settings = stored_settings;
    /* Disable canonical mode, and set buffer size to 1 byte */
    new_settings.c_lflag &= (~ICANON);
    new_settings.c_cc[VTIME] = 0;
    new_settings.c_cc[VMIN] = 1;
    tcsetattr(0,TCSANOW,&new_settings);
}

void reset_keypress(void)
{
    tcsetattr(0,TCSANOW,&stored_settings);
}

void sig_int()
{
    reset_keypress();
    exit(100);
}

int main()
{
    signal(SIGINT, sig_int);
    set_keypress();
    while(1)
    {
        int i = getc(stdin);
        printf("\t%c", i);
    }
    return EXIT_SUCCESS;        /* never reached */
}
////////////////////////////////////////////////////

es ist sicher noch mehr möglich
wie gesagt im Netz finden sich sicherlich andere Beispiele

Gruss, Daniel

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.