如何在Linux上捕获键盘事件并使用监视器作为文本显示器?

7
我有一台运行在多用户模式下的服务器,连接了键盘和显示器。我想在另一台电脑上通过SSH连接到服务器并运行一个程序,该程序从键盘捕获输入并将文本打印到显示器上。键盘和显示器将永远不会用于其他任何目的。
现在,当服务器启动时,显示器上会显示一个(文本)登录界面。我知道可以写入相应的/dev/tty设备。但是,键盘也会写入同样的位置。
如何捕获键盘事件并在Linux上使用显示器作为文本显示器?
我可能缺少有关Linux硬件接口的基础知识。我需要知道什么?
时间有限 - 如果有人愿意进一步完善这个问题,我会相应地奖励:
我执行了以下操作以防止任何登录程序启动:
systemctl mask serial-getty@ttyO0
systemctl mask systemd-logind
systemctl mask getty@tty1

需要时,我会使用以下命令来运行我的程序:

openvt -c 1 -f /path/to/my/program

这个解决方案是完全令人满意的,除了那个讨厌的-f。在tty1上运行了什么?我能做些什么来停止它吗?我应该停止它吗?
值得注意的是,这个解决方案确实满足我所有的需求 - 据我所知,我正在接管tty,因此可以访问其stdin(从键盘接收输出)和stdout(打印到显示器)。

你能详细说明一下吗?我没有看到“如何启动程序”和“程序如何实现其目标”之间的联系。 - ToBeReplaced
哦,我明白了。您想要接口的键盘和显示器连接到服务器上。这就是openvt的作用。 - Ignacio Vazquez-Abrams
好的,对于一个systemd系统的起点是禁用getty@tty1.service并编辑/etc/systemd/logind.conf设置NAutoVTs=0ReserveVT=0。现在没有登录提示将会被激活,我可以写入/dev/tty0来打印我想要的内容。那么我如何查看键盘连接到了哪里呢?(例如Alt-F2仍然会尝试切换到tty2)。 - ToBeReplaced
不要禁用getty,而是应该替换它。你的程序应该在那里运行。 - Laszlo Valko
当系统启动您的getty替代品时,无需手动操作,它会自动完成。 - Laszlo Valko
显示剩余3条评论
1个回答

2
如果你愿意进行低级编程,就不必处理标准输入输出。直接与键盘设备和控制台设备通信即可。
可以查看input-utilsinput-events的源代码。它使用原始数据读取键盘、鼠标或其他任何输入设备。
为了避免默认处理键盘,它使用“抓取”模式(CLI 中的-g),这意味着:
ioctl(fd,EVIOCGRAB,1)

在设备文件描述符中。从/dev/input/event*读取原始事件更或多或少是直截了当的:#include <linux/input.h>,执行抓取操作,然后从设备读取struct input_event结构。
如果你不想搞乱TTY,现在你已经处于低级模式,可以直接写入/dev/vcs,或者对于彩色输出,写入/dev/vcsa
基本上,每个屏幕单元在vcs中有一个字节包含所显示字符的代码。在vcs中有两个字节:字符和属性。有关详细信息,请参见man vcs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接