sam*_*moz 2 c signals copy-paste sigint
我正在尝试写一个shell,我正处于我想忽略的地步CtrlC.
我目前有我的程序忽略SIGINT并在信号到来时打印一个新行,但是如何防止^C打印?
按下时CtrlC,这是我得到的:
myshell>^C
myshell>^C
myshell>^C
Run Code Online (Sandbox Code Playgroud)
但我想要:
myshell>
myshell>
myshell>
Run Code Online (Sandbox Code Playgroud)
这是我的代码CtrlC:
extern "C" void disp( int sig )
{
printf("\n");
}
main()
{
sigset( SIGINT, disp );
while(1)
{
Command::_currentCommand.prompt();
yyparse();
}
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*itb 11
这是终端,它回应了那件事.你必须告诉它停止这样做.我的manpage stty说
* [-]ctlecho
echo control characters in hat notation (`^c')
Run Code Online (Sandbox Code Playgroud)
跑步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
Run Code Online (Sandbox Code Playgroud)
因此,使用正确的参数运行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();
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以考虑使用GNU readline读取一行输入.据我所知,它可以选择阻止终端做这种事情.
| 归档时间: |
|
| 查看次数: |
3018 次 |
| 最近记录: |