忽略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();
}
}
答
这是终端,回声的东西。你必须告诉它停止这样做。我的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?
也许你想标记这与你的平台... – dmckee 2009-03-04 01:33:56