栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从Linux输入设备访问键

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从Linux输入设备访问键

打开输入设备,

#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <errno.h>#include <linux/input.h>#include <string.h>#include <stdio.h>static const char *const evval[3] = {    "RELEASED",    "PRESSED ",    "REPEATED"};int main(void){    const char *dev = "/dev/input/by-path/platform-i8042-serio-0-event-kbd";    struct input_event ev;    ssize_t n;    int fd;    fd = open(dev, O_RDONLY);    if (fd == -1) {        fprintf(stderr, "Cannot open %s: %s.n", dev, strerror(errno));        return EXIT_FAILURE;    }

然后从设备 读取 键盘事件:

    while (1) {        n = read(fd, &ev, sizeof ev);        if (n == (ssize_t)-1) { if (errno == EINTR)     continue; else     break;        } else        if (n != sizeof ev) { errno = EIO; break;        }

如果发生任何错误,或者用户空间仅接收部分事件结构(不应发生,但可能在将来的/笨拙的内核中发生),则以上代码段将从循环中中断。您可能希望使用更强大的读取循环;我个人会被替换最后一个满足

break
continue
,所以,局部的事件结构被忽略。

然后,您可以检查

ev
事件结构以查看发生了什么,并完成程序:

        if (ev.type == EV_KEY && ev.value >= 0 && ev.value <= 2) printf("%s 0x%04x (%d)n", evval[ev.value], (int)ev.pre, (int)ev.pre);    }    fflush(stdout);    fprintf(stderr, "%s.n", strerror(errno));    return EXIT_FAILURE;}

对于按键,

  • ev.time
    :事件的时间(
    struct timeval
    类型)

  • ev.type
    EV_KEY

  • ev.pre
    KEY_*
    ,密钥标识符;请参阅中的完整列表
    /usr/include/linux/input.h

  • ev.value
    0
    如果释放按键
    1
    2
    如果按键,如果自动重复按键

有关更多详细信息,请参见Linux内核资源中的documentation / input /
input.txt

in

/usr/include/linux/input.h
中的命名常量非常稳定,因为它是内核-
用户空间接口,内核开发人员非常努力地维护兼容性。(也就是说,您可以期望偶尔会有新的代码,但是现有代码很少更改。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405731.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号