如何检测不同的控制信号?

时间:2016-11-05 22:30:30

标签: c signals

在我的程序中,我想检测用户何时按下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,我怎样才能检测到其他字符呢?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

不要被各种版本的图书馆的年龄所欺骗(尽管如果你能利用它,我会建议使用ncurses 6); curses界面稳定,并且使用了很长时间。 Ncurses确实添加了一些有用的东西,并且仍在积极维护。