如何在Linux上通过系统调用等待按键中断?

怪胎

当用户在程序中按nasm编写的特殊按键(如F1-12)时,我希望收到中断。我只需要在主要功能开始时等待功能击键。我知道BIOSint 16h可以返回扫描代码。如何在Linux下执行此操作?

塞尔克格斯

所需的代码相当复杂。我最终想出了如何使用原始ioctl在C中检查F1,进行读取和写入的方法。如果您熟悉汇编和Linux syscall,则将nasm的翻译应该很简单。

这并不是您想要的,因为它只检查F1,而不检查其余部分。F1的顺序为0x1b,0x4f,0x50。您可以od -t x1通过按键找到其他序列例如,F2是0x1b,0x4f,0x51。

基本思想是,我们获得当前的终端属性,将其更新为原始属性(cfmakeraw),然后将其重新设置。ioctl syscall用于此目的。

在原始模式的终端上,read()将获得用户键入的任何字符,这与“煮熟”模式不同,在“煮熟”模式下,内核使用退格键和Ctrl-u进行行编辑,直到用户通过按Enter或Ctrl- d(EOF)。

#include <unistd.h>
#include <sys/ioctl.h>
#include <termios.h>

struct ktermios {
    tcflag_t c_iflag;
    tcflag_t c_oflag;
    tcflag_t c_cflag;
    tcflag_t c_lflag;
    cc_t c_line;
    cc_t c_cc[19];
};

int getch() {
    unsigned char c;
    read(0, &c, sizeof(c));
    return c;
}

int main(int argc, char *argv[]) {
    struct ktermios orig, new;
    ioctl(0, TCGETS, &orig);
    ioctl(0, TCGETS, &new);   // or more simply  new = orig;

    // from cfmakeraw documentation
    new.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
    new.c_oflag &= ~OPOST;
    new.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
    new.c_cflag &= ~(CSIZE | PARENB);
    new.c_cflag |= CS8;

    ioctl(0, TCSETS, &new);

    while (1) {
        if (getch() == 0x1b && getch() == 0x4f && getch() == 0x50) {
            break;
        }
    }

    write(1, "Got F1!\n", 8);
    ioctl(0, TCSETS, &orig);    // restore original settings before exiting!
    return 0;
}

我基于此答案,这非常有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在WPF中通过按键中断while循环?

来自分类Dev

如何在Windows 10系统上启用键盘按键声音?

来自分类Dev

在Linux上,如何通过系统调用或Shell命令监视文件/目录的更改?

来自分类Dev

如何在 tkinter 中等待多个按键?

来自分类Dev

如何在Rstudio中通过z shell而不是bash在Linux上使用Windows子系统?

来自分类Dev

如何通过检测按键来中断Python中的此循环

来自分类Dev

如何从Qt中的按键事件调用已定义的插槽/如何在gui上的QPushbutton连接按键事件?

来自分类Dev

如何在iOS上通过硬件键盘检测按键上/下键事件?

来自分类Dev

如何在Linux中分解信号系统调用原型?

来自分类Dev

如何在bash上与系统调用共享参数?

来自分类Dev

如何在某些按键组合上开始中断

来自分类Dev

如何在Linux中捕获按键(按键记录)?

来自分类Dev

SIGALRM中断系统调用

来自分类Dev

什么是中断的系统调用?

来自分类Dev

如何在gentoo linux系统上安装eclipse 4.3.1?

来自分类Dev

如何在Linux下的系统上获取进程ID列表?

来自分类Dev

如何在不同的Linux系统上同时运行jar

来自分类Dev

检查如何在Linux系统上分配空间

来自分类Dev

如何在Amazon Linux系统上安装RPM密钥?

来自分类Dev

如何在Linux系统上删除消失的文件?

来自分类Dev

如何在Android的Softkeyboad上捕获按键

来自分类Dev

如何在Android上取消按键操作

来自分类Dev

如何在按键上使用$(this)

来自分类Dev

如何在Windows子系统的Linux子系统上为Windows和Linux使用相同的Python

来自分类Dev

如何在Windows子系统的Linux子系统上为Windows和Linux使用相同的Python

来自分类Dev

如何在Python中调用Linux命令而不等待结果(Linux)

来自分类Dev

Linux上的睡眠系统调用-与信号交互

来自分类Dev

通过文件系统在Linux上启用ssh

来自分类Dev

如何在BlockingCollection <T>实例上进行可中断的等待?

Related 相关文章

  1. 1

    如何在WPF中通过按键中断while循环?

  2. 2

    如何在Windows 10系统上启用键盘按键声音?

  3. 3

    在Linux上,如何通过系统调用或Shell命令监视文件/目录的更改?

  4. 4

    如何在 tkinter 中等待多个按键?

  5. 5

    如何在Rstudio中通过z shell而不是bash在Linux上使用Windows子系统?

  6. 6

    如何通过检测按键来中断Python中的此循环

  7. 7

    如何从Qt中的按键事件调用已定义的插槽/如何在gui上的QPushbutton连接按键事件?

  8. 8

    如何在iOS上通过硬件键盘检测按键上/下键事件?

  9. 9

    如何在Linux中分解信号系统调用原型?

  10. 10

    如何在bash上与系统调用共享参数?

  11. 11

    如何在某些按键组合上开始中断

  12. 12

    如何在Linux中捕获按键(按键记录)?

  13. 13

    SIGALRM中断系统调用

  14. 14

    什么是中断的系统调用?

  15. 15

    如何在gentoo linux系统上安装eclipse 4.3.1?

  16. 16

    如何在Linux下的系统上获取进程ID列表?

  17. 17

    如何在不同的Linux系统上同时运行jar

  18. 18

    检查如何在Linux系统上分配空间

  19. 19

    如何在Amazon Linux系统上安装RPM密钥?

  20. 20

    如何在Linux系统上删除消失的文件?

  21. 21

    如何在Android的Softkeyboad上捕获按键

  22. 22

    如何在Android上取消按键操作

  23. 23

    如何在按键上使用$(this)

  24. 24

    如何在Windows子系统的Linux子系统上为Windows和Linux使用相同的Python

  25. 25

    如何在Windows子系统的Linux子系统上为Windows和Linux使用相同的Python

  26. 26

    如何在Python中调用Linux命令而不等待结果(Linux)

  27. 27

    Linux上的睡眠系统调用-与信号交互

  28. 28

    通过文件系统在Linux上启用ssh

  29. 29

    如何在BlockingCollection <T>实例上进行可中断的等待?

热门标签

归档