【问题标题】:How can I detect different control signals?如何检测不同的控制信号?
【发布时间】:2016-11-05 22:30:30
【问题描述】:

在我的程序中,我想检测用户何时按下 ctrl + a,b,c,d,e... 每个角色都有不同的动作。我有:

int main(){
    signal(SIGINT, sighandler);
    while(1) {
      sleep(1); 
    }
    return(0);
}

void sighandler(int signum){
   printf("Caught signal %d, coming out...\n", signum);
   exit(1);
}

我想控制 ctrl+chars 的作用,但目前只检测到 ctrl+c,我怎样才能检测到其他字符呢?

【问题讨论】:

  • 大多数按键不发送信号。捕获信号不是进行控制字符输入的方法。您可能希望一次查看一个字符(又名“raw”或“cbreak”)inut。

标签: c signals


【解决方案1】:

没有。 Ctrl+C 不是“控制信号”。

在 POSIX 系统中,终端具有三个按键可导致内核向从终端读取的进程发送信号:Ctrl+C 用于中断 (SIGINT) , Ctrl+\ 表示退出 (SIGQUIT), Ctrl+Z 表示暂停 (SIGTSTP) .您可以使用 POSIX termios 接口将按键覆盖到几乎任何 Ctrl+key 组合 - 但请记住,只有三个(信号和可能的按键)。

使用 termios 界面(或等效于脚本中的 stty 命令)将终端置于原始模式更为常见,在这种情况下,应用程序将获取内核或图形用户界面未使用的所有按键(保留用于切换终端、关闭窗口等的组合键。

最便携的方法是使用一个非常常见的库Curses。最常见的实现(与普通的 Curses 相比有一些额外的好处)是ncurses——不需要去那个链接下载和编译源代码;该库已为您的发行版打包,因此您可以在标准软件存储库中找到它。对于 Windows,有PDCurses;有了 MinGW 编译器,你也可以在 Windows 中使用 ncurses。

不要被各种版本库的年龄所迷惑(尽管如果你可以使用它,我确实推荐 ncurses 6); curses 界面很稳定,用了很长时间。 Ncurses 确实添加了一些有用的东西,并且仍在积极维护中。

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2011-12-19
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2011-09-24
    • 1970-01-01
    相关资源
    最近更新 更多