Linux键盘原始读取,什么更好,从/ dev / input / event0读取或从stdin读取?

时间:2014-08-28 19:59:52

标签: c linux input io raspberry-pi

我正在为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(s)。

3 个答案:

答案 0 :(得分:4)

阅读标准输入不仅限于阅读本地连接的键盘(但还有其他限制,使其主要不适合游戏)。然后读取stdin,您可以使用本地连接的串行终端或终端仿真器(可能从远程X服务器操作)来读取远程登录用户的击键。

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

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

答案 1 :(得分:3)

扩展Fabel答案 - 标准输入和event1完全不同。从那开始event1不一定是鼠标,但可以是其他设备,取决于udev,内核版本,月相等等 - 在我的(非Raspberry Pi)系统上{{1} - 具有键盘接口。简而言之,你不能也不应该假设它的键盘 - 或者是唯一的键盘(例如YubiKey也会模仿键盘的功能,但它作为游戏设备并没有用,而且虽然2个键盘很少连接到相同的Raspberry Pi我不认为假设这种设置永远不会发生是个好主意。)

此外,通常输入设备只能由特权用户(在旧系统/当前系统上)或持有座位的用户读取。 (在无根X系统上) - 假设你没有使用前沿系统,这意味着你的游戏只能由root用户使用,通常被认为是bad idea

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

另一方面,你可以做的是直接使用标准输入,使用一些更可移植的库,如readline(这应该足够rougulike)或使用图形服务器(可能间接通过库像QTSDL那样X11并不是最好的编程方案。

答案 2 :(得分:1)

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

配置和使用stdin适用于任何实现POSIX.1-2008的系统,特别是章节11: General Terminal Interface。因此,如果您想要可移植代码,比如说在Linux和OS X上工作而不重写输入系统,那么您就是这样做的。