2009-03-04 14 views
2

Ich versuche, eine Shell zu schreiben, und ich bin an dem Punkt, wo ich ignorieren möchte CtrlC.Ignorieren ctrl-c

Ich habe derzeit mein Programm Ignorieren SIGINT und Drucken einer neuen Zeile, wenn das Signal kommt, aber wie kann ich verhindern, dass die ^C gedruckt wird?

Beim Drücken CtrlC, hier ist das, was ich bekommen:

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

aber ich will:

myshell> 
myshell> 
myshell> 

Hier ist mein Code relevant CtrlC:

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

main() 
{ 
    sigset(SIGINT, disp); 
    while(1) 
    { 
     Command::_currentCommand.prompt(); 
     yyparse(); 
    } 
} 
+0

Vielleicht möchten Sie dies mit Ihrer Plattform markieren ... – dmckee

Antwort

10

Es ist das Terminal, das dieses Ding Echo. Sie müssen es sagen, damit aufhören zu tun. Mein manpage von stty sagt

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

strace stty ctlecho zeigt

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 

So läuft ioctl mit den richtigen Parametern ausgeführt könnte diese Steuerschalter Echo aus. Schauen Sie in man termios für eine bequeme Schnittstelle zu denen. Es ist leicht, sie

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

Alternativ zu verwenden, können Sie betrachten GNU readline mit einer Eingabezeile zu lesen. Soweit ich weiß, hat es Optionen, um das Terminal zu stoppen, solche Sachen zu machen.

0

Versuchen Sie, das Backspace-Zeichen zu drucken, aka \ b?