Ignorando ctrl-c
-
03-07-2019 - |
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();
}
}
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?