Pergunta

Eu estou tentando escrever um shell e eu estou no ponto onde eu quero ignorar Ctrl C .

Actualmente tenho meu programa ignorando SIGINT e imprimir uma nova linha quando o sinal vem, mas como posso evitar que o ^C de ser impresso?

Ao pressionar Ctrl C , aqui está o que eu recebo:

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

mas eu quero:

myshell>
myshell>
myshell>

Aqui está o meu código relevante para Ctrl C :

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

main()
{
    sigset( SIGINT, disp );
    while(1)
    {
        Command::_currentCommand.prompt();
        yyparse();
    }
}
Foi útil?

Solução

É o terminal que faz eco que coisa. Você tem que dizer-lhe para parar de fazer isso. Meu manpage de stty diz

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

correndo mostra strace stty ctlecho

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

Assim sendo executado ioctl com os parâmetros corretos poderia mudar esse controle echo off. Olhe para man termios para uma interface conveniente para aqueles. É fácil de usá-los

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

Como alternativa, você pode considerar o uso de GNU readline para ler uma linha de entrada. Tanto quanto eu sei, ele tem opções para parar o terminal fazendo esse tipo de coisa.

Outras dicas

Tente imprimir o caráter de retrocesso, também conhecido como \ b?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top