Unix中的键盘设备

时间:2013-04-07 22:33:45

标签: linux keyboard drivers device

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

我做了这个编码,但它不能正常工作

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);

我希望终端等待输入,但事实并非如此。

2 个答案:

答案 0 :(得分:10)

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

如果您正在运行GUI应用程序,则低级方法是调用XNextEvent和同一系列中的其他功能。解码输入事件并不是完全无关紧要的,因为它取决于应用修饰符的应用程序。 GUI框架(Motif,Gtk,Qt,...)可以帮助您。

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

答案 1 :(得分:1)

你到底想做什么?

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

如果您想拥有键盘的独占访问权限,那就复杂得多。