当前位置:  开发笔记 > IOS > 正文

忽略ctrl-c

如何解决《忽略ctrl-c》经验,为你挑选了1个好方法。

我正在尝试写一个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读取一行输入.据我所知,它可以选择阻止终端做这种事情.



1> Johannes Sch..:

这是终端,它回应了那件事.你必须告诉它停止这样做.我的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读取一行输入.据我所知,它可以选择阻止终端做这种事情.

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有