Linux键盘延迟

时间:2018-01-02 22:59:47

标签: linux kernel interrupt-handling insmod

所以我想构建一个内核模块(我想),它会在按下键盘键后插入一点延迟(假设说500ms)。我设法通过挂钩在Windows中执行此操作,但在Linux中似乎有所不同。请注意,我不希望使用x11方法,因为我希望它也可以在Linux控制台上运行(即使没有运行X服务器)。根据我的理解,它需要构建一个内核模块并使用insmod将其动态插入到内核中。我设法构建了一个密钥记录器,它将每个按下的密钥转储到内核日志中,但插入延迟需要将处理键盘中断处理程序的线程发送到睡眠状态,这是一个非常糟糕的主意,并且还要重写整个USB_KBD驱动程序,因为当前脚本调用了设置了IRQF_SHARED标志的request_irq函数,所以我想原始驱动程序在执行我的函数之前仍然可以完成它的工作。

我目前正在请求像这样的中断处理程序

request_irq (1, (irq_handler_t) irq_handler, IRQF_SHARED, "keyboard_stats_irq", (void *)(irq_handler));

有关如何处理此问题的任何建议(任何其他方式)?

1 个答案:

答案 0 :(得分:1)

您可以编写一个用户空间守护程序,它从/dev/input/input*(无论键盘设备是什么)读取输入事件,同时抓取设备以阻止事件通过系统的其余部分({{1} })。

然后,守护程序可以使用ioctl(fd, EVIOCGRAB, 1)创建一个虚拟输入设备,并在一段延迟后写入输入事件。由于延迟将在用户空间中实现,这将非常容易。

启动守护程序相当于热插拔虚拟键盘,现代X服务器(不到10年?)能够应对热插拔输入设备。而且vconsole驱动程序也适用于那些。