我想从键盘设备捕获所有用户输入,一次读取一个字节。我编写了以下代码,但它不起作用:
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);
我预计终端会等待输入,但它没有。
键盘设备本身是
/dev/input
中的条目之一。您可以在 /dev/input/by-path
中按连接类型(例如 PS/2、USB 等)找到键盘和其他输入设备。显然,您需要以 root 身份运行才能直接访问硬件,并且您需要提供自己的翻译,将来自键盘的原始字节转换为按键和按键释放等内容。这可能不是您想要的。
XNextEvent
以及同一系列中的其他函数。解码输入事件并不完全是微不足道的,因为它取决于应用程序来应用修饰符。 GUI 框架(Motif、Gtk、Qt...)会对您有所帮助。
如果您正在运行终端应用程序,请从标准输入或从
/dev/tty
读取(/dev/tty
始终是程序运行的终端,即使标准输入已被重定向)。您需要将终端置于“原始模式”。您将获得解码的字符键和功能键(主要是转义序列)。在这方面,图书馆也能有所帮助;事实上的标准是ncurses。
如果您正在寻找的是终端中的无缓冲输入,则
tcsetattr()
就是您正在寻找的 - 您需要将终端置于非规范模式,即将终端标志设置为不包含
ICANON
- 请参阅例如此代码片段。请参阅
man termios
(或函数名称,它通常链接到 Linux 上的同一手册页)。如果你想独占键盘的访问权限,那就复杂得多。