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