忽略ctrl-c

时间:2009-03-04 01:21:31

标签: c signals copy-paste sigint

我正在尝试编写一个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();
    }
}

2 个答案:

答案 0 :(得分:11)

终端确实回应了那个东西。你必须告诉它停止这样做。我的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来读取输入行。据我所知,它可以选择阻止终端做这种事情。

答案 1 :(得分:0)

尝试打印退格符,即\ b?