Comme déjà indiqué, vous pouvez utiliser sigaction
de piège ctrl-c ou select
pour intercepter toute entrée standard.
À noter toutefois qu'avec la deuxième méthode, vous devez également définir le terminal de sorte qu'il est de caractère-à-un-temps plutôt que de ligne-à-un-temps. Le second est la valeur par défaut - si vous entrez une ligne de texte, il n'est pas envoyé à l'exécution du programme stdin jusqu'à ce que vous appuyez sur entrée.
Vous auriez besoin d'utiliser l' tcsetattr()
fonction pour désactiver ICANON mode, et probablement aussi de désactiver l'ÉCHO aussi. À partir de la mémoire, vous devez également définir le terminal de retour dans ICANON mode lorsque le programme se termine!
Juste pour être complet, voici un code que j'ai juste frappé vers le haut (nb: pas de vérification d'erreur!) qui met en place un Unix ATS et émule le DOS <conio.h>
fonctions kbhit()
et 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;
/* take two copies - one for now, one for later */
tcgetattr(0, &orig_termios);
memcpy(&new_termios, &orig_termios, sizeof(new_termios));
/* register cleanup handler, and set the new terminal mode */
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()) {
/* do some work */
}
(void)getch(); /* consume the character */
}