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