3

我正在尝试编写一个 shell,而我正处于我想忽略的地步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 回答