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