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();
    }
}
Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top