Wie bereits erwähnt, können Sie sigaction
Strg-C oder select
jede Standardeingabe abfangen .
Beachten Sie jedoch, dass Sie bei der letzteren Methode auch die TTY so einstellen müssen, dass sie sich im Zeichen-zu-Zeit-Modus und nicht im Zeilen-zu-Zeit-Modus befindet. Letzteres ist die Standardeinstellung. Wenn Sie eine Textzeile eingeben, wird diese erst dann an den Standard des laufenden Programms gesendet, wenn Sie die Eingabetaste drücken.
Sie müssten die tcsetattr()
Funktion verwenden, um den ICANON-Modus auszuschalten und wahrscheinlich auch ECHO zu deaktivieren. Aus dem Speicher müssen Sie das Terminal auch beim Beenden des Programms wieder in den ICANON-Modus versetzen!
Der Vollständigkeit halber hier ein Code, den ich gerade aufgerissen habe (nb: keine Fehlerprüfung!), Der ein Unix-TTY einrichtet und die DOS- <conio.h>
Funktionen emuliert kbhit()
und getch()
:
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <termios.h>
struct termios orig_termios;
void reset_terminal_mode()
{
tcsetattr(0, TCSANOW, &orig_termios);
}
void set_conio_terminal_mode()
{
struct termios new_termios;
tcgetattr(0, &orig_termios);
memcpy(&new_termios, &orig_termios, sizeof(new_termios));
atexit(reset_terminal_mode);
cfmakeraw(&new_termios);
tcsetattr(0, TCSANOW, &new_termios);
}
int kbhit()
{
struct timeval tv = { 0L, 0L };
fd_set fds;
FD_ZERO(&fds);
FD_SET(0, &fds);
return select(1, &fds, NULL, NULL, &tv);
}
int getch()
{
int r;
unsigned char c;
if ((r = read(0, &c, sizeof(c))) < 0) {
return r;
} else {
return c;
}
}
int main(int argc, char *argv[])
{
set_conio_terminal_mode();
while (!kbhit()) {
}
(void)getch();
}