c语言 - Linux 键盘原始读取,哪个更好,从 /dev/input/event0 读取还是从 stdin 读取?



我正在为Raspberry Pi开发一个小型C视频游戏库。我正在从头开始对输入系统进行编码,在阅读并看到一些关于原始输入读取的示例后,我产生了一些疑问。

对于鼠标读取,我只使用/dev/input/event1,将其作为O_NONBLOCK打开(),读取()input_event(s),并将鼠标读取放在一个单独的pthread中。容易的

对于键盘阅读,我看到了一些示例,它们将stdin重新配置为O_NONBLOCK(使用fcntl()),然后保存并重新配置键盘termios attibutes(ICANON,ECHO),还有一些示例还使用ioctl()保存并重新配置键盘模式。做所有这些事情而不是只读取/dev/input/event0 input_event(s)(与鼠标相同)有什么意义?

请注意,我不知道这些函数的作用,我只是不知道为什么应该更好地做所有这些事情,而不仅仅是读取input_event。

读取stdin不仅限于读取本地连接的键盘(还有其他限制,使其大多不适合游戏)。然后读取stdin,您可以使用本地连接的串行终端或终端模拟器(可能是从远程X服务器操作的)从远程登录的用户读取击键。

对于基于终端的游戏,使用stdin可能是有意义的。但是,使用GPM可能会更好,而不是为鼠标读取/dev/input/event1。甚至可能更好的是,对所有事情都使用ncurses。

否则,如果不是为了直接使用SDL,至少为了了解读取输入的不同方法,您可能需要查看SDL。例如,SDL完全支持使用X的网络透明度。这意味着游戏可以在一台计算机上执行,但可以在另一台电脑上玩。

扩展Fabel答案-标准输入和event1是完全不同的东西。从这一点开始,event1不一定是鼠标,但可以是其他设备,具体取决于udev、内核版本、月相等。在我的(非Raspberry Pi)系统上,它是input device Sleep Button,它有键盘接口。简言之,你不能也不应该假设它是键盘,或者是唯一的键盘(例如,YubiKey也模仿键盘的功能,但它作为游戏设备相当无用,虽然两个键盘很少连接到同一个树莓派,但我认为假设这种设置从未发生过是不好的)。

此外,通常输入设备只能由特权用户(在旧的/当前的系统上)或持有"座位"的用户(在无根X系统上)读取-假设你没有使用出血边缘系统,这意味着你的游戏只能由根用户使用,这通常被认为是一个坏的想法。

最后,它只允许用户使用evdev子系统进行游戏,这可能应该被视为Linux/X11的实现细节。如果您尝试通过网络(X11、vnc或whatserver)连接,请尝试使用屏幕键盘或任何可访问的输入程序——您可能会遇到问题。

另一方面,您可以直接使用标准输入,使用一些更可移植的库,如readline(这对于rougulike来说应该足够了)或使用图形服务器(可能间接通过QT或SDL等库,因为X11不是最好的编程协议)。

/dev/input/eventN读取仅适用于GNU/Linux。

配置和使用stdin适用于任何实现POSIX.1-2008的系统,特别是第11章:通用终端接口。因此,如果你想要可移植的代码,比如说在Linux和OSX上工作而不重写输入系统,你可以这样做。

最新更新