3

シェルを作成しようとしていますが、無視したいところですCtrlC

現在、プログラムで SIGINT を無視し、信号が来ると新しい行を印刷していますが、^C印刷されないようにするにはどうすればよいですか?

を押すCtrlCと、次のようになります。

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

でも私はしたい:

myshell>
myshell>
myshell>

に関連する私のコードは次のCtrlCとおりです。

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

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

2 に答える 2

12

そのことをエコーするのは端末です。それをやめるように言わなければなりません。私のマンページはstty言う

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

ランニング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

そのため、適切なパラメーターを指定して ioctl を実行すると、そのコントロール エコーがオフになる可能性があります。man termiosそれらへの便利なインターフェースを調べてください。それらを使用するのは簡単です

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

GNU readlineまたは、 を使用して入力行を読み取ることを検討できます。私の知る限り、端末がそのようなことをするのを止めるオプションがあります。

于 2009-03-04T01:39:35.380 に答える
0

バックスペース文字、別名 \b を印刷してみてください。

于 2009-03-04T01:33:35.253 に答える