Schleifen beenden mit Tastendruck unter Linux
-
Hallo!
Bin am verzweifeln. Ich will einfach nur eine Endlosschleife die bei beliebigen Tastendruck oder bei drücken einer bestimmten Taste abricht, das ganze soll noneblocking sein. Aber irgendwie bekomme ich es einfach nicht hin. Wäre nett wenn sowas zu den FAQ hinzugefügt werden würde. Leider weiß mir nicht mehr anders zu helfen. Hab auch schon FAQ aus anderen Subforen durchsucht leider ohne Erfolg. Hab aber gefunden dass es die Funktionen getch() und kbhit() nicht unter Linux gibt und habe in den FAQ das gefunden. Daher sieht mein Code wie folgt aus.
#ifdef HAVE_CONFIG_H #include <config.h> #endif #include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <signal.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include "cssl.h" #include "knxniff.h" cssl_t *serial; /*diese beiden Funktionen sind aus dem Forum hier*/ int getch() { static int ch = -1, fd = 0; struct termios neu, alt; fd = fileno(stdin); tcgetattr(fd, &alt); neu = alt; neu.c_lflag &= ~(ICANON|ECHO); tcsetattr(fd, TCSANOW, &neu); ch = getchar(); tcsetattr(fd, TCSANOW, &alt); return ch; } int kbhit(void) { struct termios term, oterm; int fd = 0; int c = 0; tcgetattr(fd, &oterm); memcpy(&term, &oterm, sizeof(term)); term.c_lflag = term.c_lflag & (!ICANON); term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 1; tcsetattr(fd, TCSANOW, &term); c = getchar(); tcsetattr(fd, TCSANOW, &oterm); if (c != -1) ungetc(c, stdin); return ((c != -1) ? 1 : 0); } int main(int argc, char *argv[]) { static int x,y; printf("Hello, world!\n"); while (y!=1) { x=getch(); if(x=='1') { printf("hallo!"); } } puts("End"); return EXIT_SUCCESS; }
Hoffe es kann mir igendwer eine funktionierende Schleife mit Abbruchbedingung (Tastendruck) liefern. Verbringe schon 4Stunden damit
.
Mit bestem Dank im Voraus THE_ONE
-
Hi,
Schau dir mal fd_set und select an, und die vielleicht in Verbindung mit
pthreads könnten dein Problem lösen.Gruß mcr
-
Wenn Du nicht blockierend schauen willst, ob eine Taste gedrückt wurde, solltest Du die Funktion kbhit() auch benutzen
- getch() wartet weiterhin auf einen Tastendruck, wenn nicht seit der letzten Abfrage bereits einer erfolgt ist (tut die Version aus conio.h auch).
-
Hi,
hier mal dein Code in verbesserter Form:
#include <stdio.h> #include <stdlib.h> #include <termios.h> #include <string.h> int kbhit(void) { struct termios term, oterm; int fd = 0, c = 0; tcgetattr(fd, &oterm); memcpy(&term, &oterm, sizeof(term)); term.c_lflag = term.c_lflag & (!ICANON); term.c_cc[VMIN] = 0; term.c_cc[VTIME] = 1; tcsetattr(fd, TCSANOW, &term); c = getchar(); tcsetattr(fd, TCSANOW, &oterm); if (c != -1) ungetc(c, stdin); return ((c != -1) ? 1 : 0); } int main() { printf("Hello, world!\n"); while (1) { if (kbhit()) break; else printf("ollah\n"); } puts("End"); return EXIT_SUCCESS; }
Gruß mcr