Question
J'essaie d'écrire un shell et je suis sur le point d'ignorer Ctrl C .
Mon programme ignore actuellement SIGINT et imprime une nouvelle ligne lorsque le signal arrive, mais comment puis-je empêcher l'impression du ^ C
?
Lorsque vous appuyez sur Ctrl C , voici ce que je reçois:
myshell>^C
myshell>^C
myshell>^C
mais je veux:
myshell>
myshell>
myshell>
Voici mon code pertinent pour Ctrl C :
extern "C" void disp( int sig )
{
printf("\n");
}
main()
{
sigset( SIGINT, disp );
while(1)
{
Command::_currentCommand.prompt();
yyparse();
}
}
La solution
C'est le terminal qui fait écho à cette chose. Vous devez lui dire d'arrêter de le faire. Ma page de manuel de stty
dit
* [-]ctlecho
echo control characters in hat notation (`^c')
lancer strace stty ctlecho
affiche
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
Donc, exécuter ioctl avec les bons paramètres pourrait désactiver cet écho. Recherchez dans man termios
une interface pratique avec ceux-ci. Il est facile de les utiliser
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
void setup_term(void) {
struct termios t;
tcgetattr(0, &t);
t.c_lflag &= ~ECHOCTL;
tcsetattr(0, TCSANOW, &t);
}
int main() {
setup_term();
getchar();
}
Vous pouvez également utiliser GNU readline
pour lire une ligne d'entrée. Autant que je sache, il existe des options pour empêcher le terminal de faire ce genre de choses.
Autres conseils
Essayez d’imprimer le caractère de retour arrière, aussi appelé \ b?