【问题标题】:Keyboard device in UnixUnix中的键盘设备
【发布时间】:2013-03-30 14:23:27
【问题描述】:

如何捕获所有用户输入,一次读取一个字节?

我做了这个编码,但它不起作用

if ((fd = open("/dev/char", O_RDONLY) != 1) {
    tty = open("/dev/tty", O_RDONLY);
    tcsetattr(0, TCSANOW, &orig_info);
    read (fd, &buf, sizeof(char));
}
close(fd);

我希望终端等待输入,但它没有。

【问题讨论】:

  • 不,只是从 fd 0 读取

标签: linux keyboard drivers device


【解决方案1】:

键盘设备本身是/dev/input 中的条目之一。您可以在/dev/input/by-path 中按连接类型(例如 PS/2、USB 等)定位键盘和其他输入设备。显然,您需要以 root 身份运行才能直接访问硬件,并且您需要提供自己的翻译,将来自键盘的原始字节转换为按键和按键释放等内容。这可能不是你想要的。

如果您正在运行 GUI 应用程序,低级方法是调用 XNextEvent 和同一系列中的其他函数。解码输入事件并不完全是微不足道的,因为它取决于应用程序来应用修饰符。 GUI 框架(Motif、Gtk、Qt 等)会帮助您。

如果您正在运行终端应用程序,请从标准输入或/dev/tty 读取(/dev/tty 始终是您的程序正在运行的终端,即使标准输入已被重定向)。您需要将终端放在raw mode 中。您将获得解码的字符键和主要作为转义序列的功能键。在这里,图书馆也有帮助;事实上的标准是ncurses

【讨论】:

    【解决方案2】:

    你到底想做什么?

    如果您要查找的是终端中的无缓冲输入,tcsetattr() 就是您要查找的 - 您需要将终端置于非规范模式,即将终端标志设置为不包含 ICANON -见例如this code snippet。见man termios(或函数名,它通常链接到Linux上的同一个手册页)。

    如果你想独占访问键盘,那就复杂得多了。

    【讨论】:

    • @BunnyBunny 问题是,在大多数情况下,您想像这样从键盘上阅读 - Gilles 的答案总结得很好(一如既往:))。这就是为什么最好描述您要解决的问题 - 事实证明您并没有朝着最好的方向前进。
    • @peterph 问题很简单。打开键盘设备并一次读取一个字节。为了获得对键盘的控制,我们必须明确地使用 /dev/tty。
    • @BunnyBunny /dev/tty 不是键盘设备,它是经过处理的输入(在远程外壳的情况下甚至不需要是本地键盘)。这就是为什么我写了说明您的问题可能会有所帮助的原因 - “我需要打开键盘设备” 不是您要解决的问题 - 而是类似于 “我需要从用户一次输入一个字符,并且不能在屏幕上回显”“我需要捕获所有键盘输入”。提供更多上下文将为您提供更好的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-05-15
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2015-06-23
    • 2012-04-04
    相关资源
    最近更新 更多