Frage

Ich versuche, eine Schale zu schreiben, und ich an dem Punkt bin, wo ich ignorieren will Strg C .

Im Moment habe ich mein Programm SIGINT zu ignorieren und eine neue Linie Druck, wenn das Signal kommt, aber wie kann ich die ^C verhindern, gedruckt zu werden?

Wenn Sie Strg C , hier ist das, was ich bekommen:

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

, aber ich will:

myshell>
myshell>
myshell>

Hier ist mein Code relevant Strg C :

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

main()
{
    sigset( SIGINT, disp );
    while(1)
    {
        Command::_currentCommand.prompt();
        yyparse();
    }
}
War es hilfreich?

Lösung

Es ist das Terminal, das Echo, das Ding tut. Sie haben es zu sagen, zu tun, dass zu stoppen. Mein manpage von stty sagt

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

läuft 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 könnte diesen Steuerschalter Echo aus. Schauen Sie in man termios für eine komfortable Schnittstelle zu denen. Es ist leicht, sie zu benutzen

#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 können Sie betrachten GNU readline mit einer Eingabezeile zu lesen. Soweit ich weiß, hat es Optionen, um das Terminal zu tun, diese Art von Sachen zu stoppen.

Andere Tipps

Versuchen

Drucken des Backspace Charakter, auch bekannt als \ b?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top