Ignorando ctrl-c
-
03-07-2019 - |
Pregunta
Estoy tratando de escribir un shell y estoy en el punto donde quiero ignorar Ctrl C .
Actualmente tengo mi programa ignorando SIGINT e imprimiendo una nueva línea cuando llega la señal, pero ¿cómo puedo evitar que se imprima el ^ C
?
Al presionar Ctrl C , esto es lo que obtengo:
myshell>^C
myshell>^C
myshell>^C
pero quiero:
myshell>
myshell>
myshell>
Aquí está mi código relevante para Ctrl C :
extern "C" void disp( int sig )
{
printf("\n");
}
main()
{
sigset( SIGINT, disp );
while(1)
{
Command::_currentCommand.prompt();
yyparse();
}
}
Solución
Es la terminal la que hace eco de esa cosa. Tienes que decirle que deje de hacerlo. Mi página de manual de stty
dice
* [-]ctlecho
echo control characters in hat notation (`^c')
ejecutando strace stty ctlecho
muestra
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
Entonces, ejecutar ioctl con los parámetros correctos podría desactivar ese eco de control. Busque man termios
para obtener una interfaz conveniente para ellos. Es fácil usarlos
#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();
}
Alternativamente, puede considerar usar GNU readline
para leer una línea de entrada. Hasta donde yo sé, tiene opciones para evitar que el terminal haga ese tipo de cosas.
Otros consejos
Intente imprimir el carácter de retroceso, también conocido como \ b?