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();
    }
}
¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top