我正在尝试写一个shell,我正处于我想忽略的地步CtrlC.
我目前有我的程序忽略SIGINT并在信号到来时打印一个新行,但是如何防止^C
打印?
按下时CtrlC,这是我得到的:
myshell>^C myshell>^C myshell>^C
但我想要:
myshell> myshell> myshell>
这是我的代码CtrlC:
extern "C" void disp( int sig ) { printf("\n"); } main() { sigset( SIGINT, disp ); while(1) { Command::_currentCommand.prompt(); yyparse(); } }
Johannes Sch.. 11
这是终端,它回应了那件事.你必须告诉它停止这样做.我的manpage 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#include #include 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
读取一行输入.据我所知,它可以选择阻止终端做这种事情.
这是终端,它回应了那件事.你必须告诉它停止这样做.我的manpage 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#include #include 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
读取一行输入.据我所知,它可以选择阻止终端做这种事情.