忽略ctrl-c

问题描述:

我正在尝试编写一个shell并且我处于我想忽略的位置CtrlC忽略ctrl-c

我目前有我的程序忽略SIGINT并在信号出现时打印新行,但是如何防止^C被打印?

Ctrl键Ç当,这里是我得到:

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

,但我想:

myshell> 
myshell> 
myshell> 

下面是有关按CtrlÇ我的代码:

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

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

也许你想标记这与你的平台... – dmckee 2009-03-04 01:33:56

这是终端,回声的东西。你必须告诉它停止这样做。我的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?