C 除了/dev/input/eventx之外,还有更高级别(字符?)的方式访问Linux键盘吗?

C 除了/dev/input/eventx之外,还有更高级别(字符?)的方式访问Linux键盘吗?,c,linux,barcode-scanner,keyboard-events,input-devices,C,Linux,Barcode Scanner,Keyboard Events,Input Devices,我正在尝试编写一个Linux守护进程,它需要从一个类似键盘(HID)的设备获取输入—它不是控制台键盘,而是第二个设备(如果有什么不同的话,它实际上是一个1D条形码扫描仪)。守护进程将处理它接收到的数据(“来自字母数字条形码的击键”) 我知道守护进程可以使用ioctl(EVIOCGRAB)从/dev/input/eventx抓取该设备,然后读取()事件(struct input_event from),这是可行的,但它的级别太低,无法满足我的需要。我不需要知道每一个上下键事件,我也不想同时解码/处

我正在尝试编写一个Linux守护进程,它需要从一个类似键盘(HID)的设备获取输入—它不是控制台键盘,而是第二个设备(如果有什么不同的话,它实际上是一个1D条形码扫描仪)。守护进程将处理它接收到的数据(“来自字母数字条形码的击键”)

我知道守护进程可以使用ioctl(EVIOCGRAB)从/dev/input/eventx抓取该设备,然后读取()事件(struct input_event from),这是可行的,但它的级别太低,无法满足我的需要。我不需要知道每一个上下键事件,我也不想同时解码/处理键,也就是说,我不想知道下键+下键移位,下键+下键A,上键+下键移位,上键+下键A,我只想收到“A”

使用输入事件需要编写一大堆额外的代码,只是为了从中获得“a”-这似乎是浪费时间和精力,因为几乎可以肯定,现有的键盘处理程序(或类似的东西)比我一起破解代码做得好得多-我就是找不到它们

有没有办法将现有的(键盘?)软件层放在/dev/input/eventx上,然后守护进程就可以专门从中读取简单的ascii流

对于此设备,/proc/bus/input/devices报告

H: Handlers=sysrq kbd leds event9
。。。这可能意味着某些东西已经在它上面放置了一个“kbd”层,但是如何访问它呢


如果我没有EVIOCGRAB,那么当我扫描条形码时,我会看到关于“登录/dev/tty1失败”的系统日志,这样键盘输入显然是试图登录到某个终端/外壳:-/(这台机器上也没有X、桌面等。)

我不知道有这样的库或守护程序

然而,编写一个守护进程来实现这一点并不像您想象的那么困难。根据我的观点/经验,如果您不需要实现autorepeat(也就是说,只有在类似键盘的设备发送autorepeat按键时才执行autorepeat),那么守护进程非常简单

特别是,主循环只是一个阻塞读,后面是零或多个阻塞写,中间有一个数组查找。

您可以使用命名管道(在这种情况下,您可以在打开设备之前打开管道,因为只有在另一个进程打开命名管道或FIFO进行读取后,打开才会成功),也可以使用套接字;Unix域套接字或TCP或UDP套接字(在环回接口上)。我可能会使用一个命名管道,
/var/run/barcode scanner

我将使用一个单独的配置文件进行输入映射,并且我将支持
/usr/include/linux/input event codes.h
中的预处理器宏名称(
KEY
),该名称使用助手awk脚本解析为数组。密钥映射文件可能位于
/etc/barcode scanner/keymap
中,并且包含与

KEY_1 = 1
KEY_NUMERIC_1 = 1
KEY_E = e
shift KEY_E = E
ctrl KEY_E = \5
altgr KEY_E = €
KEY_UP = \033[A
等等。定义文件中未列出的事件将被忽略或选择性地记录

您可以使用数组,因为最多有768个不同的键盘事件(0到最大键,包括0;尽管0是保留键);作为二维数组,当按下每个键时,您可能需要16个数组来支持Shift、Ctrl、Alt和AltGr(或右Alt键)的所有组合。在内部,您只需处理
KEY\u LEFTSHIFT
KEY\u RIGHTSHIFT
KEY\u CAPSLOCK
(以管理换档状态)<代码>按左alt键(用于管理alt状态)<代码>按Alt键(用于管理altgr状态);和
按左键ctrl
按右键ctrl
(以管理ctrl状态)。如果使用位掩码指示当前状态,则可以将其用作查找数组外部维度的索引。这真的很简单

请注意,每个数组元素都是一个字符串,当按下该状态的键时会发出该字符串(
ev.value==1
用于按键,而
ev.value==2
用于自动重放)。除了上述特殊键之外,您根本不需要处理键释放

嗯,我想知道是否还有其他人需要这样一个守护进程?如果源代码位于GitHub,您会使用GPL3许可的库吗?

库并不是您想要的。但是它被广泛使用(例如Xorg服务器evdev和libinput驱动程序)

作为主页上的状态:

libevdev本质上是/dev/input/eventX设备的读(2)功能

它为您管理
ioctl
调用、处理事件队列等

您没有要求的另一个功能,但它确实很有用:它可以同时处理来自多个设备的事件。它允许您侦听位于/dev/input中的多个设备,并在单个线程中处理相同的事件类型