Domanda

Sto provando a scrivere una shell e sono nel punto in cui voglio ignorare Ctrl C .

Al momento il mio programma ignora SIGINT e stampa una nuova riga quando arriva il segnale, ma come posso impedire la stampa del ^ C ?

Quando premo Ctrl C , ecco cosa ottengo:

myshell>^C
myshell>^C
myshell>^C

ma voglio:

myshell>
myshell>
myshell>

Ecco il mio codice relativo a Ctrl C :

extern "C" void disp( int sig )
{
    printf("\n");
}

main()
{
    sigset( SIGINT, disp );
    while(1)
    {
        Command::_currentCommand.prompt();
        yyparse();
    }
}
È stato utile?

Soluzione

È il terminale che fa eco a quella cosa. Devi dirlo per smettere di farlo. La mia manpage di stty dice

* [-]ctlecho
       echo control characters in hat notation (`^c')

esegue strace stty ctlecho mostra

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

Quindi l'esecuzione di ioctl con i parametri giusti potrebbe disattivare il controllo dell'eco. Cerca in man termios una comoda interfaccia per quelli. È facile usarli

#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();
}

In alternativa, puoi prendere in considerazione l'uso di GNU readline per leggere una riga di input. Per quanto ne so, ha opzioni per impedire al terminale di fare quel genere di cose.

Altri suggerimenti

Prova a stampare il carattere backspace, noto anche come \ b?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top