打开输入设备,
#include#include #include #include #include #include #include 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.code, (int)ev.code); } fflush(stdout); fprintf(stderr, "%s.\n", strerror(errno)); return EXIT_FAILURE; }
对于按键,
ev.time
:活动时间(struct timeval
类型)
ev.type
: EV_KEY
ev.code
:KEY_*
,密钥标识符; 查看完整列表/usr/include/linux/input.h
ev.value
:0
如果按键释放,1
如果按键,2
如果是自动重复按键
有关更多详细信息,请参阅Linux内核源代码中的Documentation/input/input.txt.
命名常量/usr/include/linux/input.h
非常稳定,因为它是一个内核用户空间接口,内核开发人员非常努力地保持兼容性.(也就是说,您可能会偶尔会有新代码,但现有代码很少会发生变化.)
打开输入设备,
#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.code, (int)ev.code); } fflush(stdout); fprintf(stderr, "%s.\n", strerror(errno)); return EXIT_FAILURE; }
对于按键,
ev.time
:活动时间(struct timeval
类型)
ev.type
: EV_KEY
ev.code
:KEY_*
,密钥标识符; 查看完整列表/usr/include/linux/input.h
ev.value
:0
如果按键释放,1
如果按键,2
如果是自动重复按键
有关更多详细信息,请参阅Linux内核源代码中的Documentation/input/input.txt.
命名常量/usr/include/linux/input.h
非常稳定,因为它是一个内核用户空间接口,内核开发人员非常努力地保持兼容性.(也就是说,您可能会偶尔会有新代码,但现有代码很少会发生变化.)