質問

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

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

Ctrl C を押すと、次のようになります:

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

しかし、私は欲しい:

myshell>
myshell>
myshell>

Ctrl C に関連するコードは次のとおりです:

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

main()
{
    sigset( SIGINT, disp );
    while(1)
    {
        Command::_currentCommand.prompt();
        yyparse();
    }
}
役に立ちましたか?

解決

そのことをエコーするのは端末です。それをやめるように言わなければなりません。 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 を使用して入力行を読み取ることを検討できます。私の知る限り、このようなことをしている端末を停止するオプションがあります。

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top