6

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

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

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

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

4

2 回答 2

11

键盘设备本身就是/dev/input. 您可以在/dev/input/by-path. 显然,您需要以 root 身份运行才能直接访问硬件,并且您需要提供自己的翻译,将来自键盘的原始字节转换为按键和按键释放等内容。这可能不是你想要的。

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

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

于 2013-04-08T00:37:06.830 回答
1

你到底想做什么?

如果您正在寻找的是终端中的无缓冲输入,tcsetattr()那就是您正在寻找的 - 您需要将终端置于非规范模式,即将终端标志设置为不包含ICANON- 参见例如此代码片段。请参阅man termios(或函数名称,它通常链接到 Linux 上的同一手册页)。

如果您想独占访问键盘,则要复杂得多。

于 2013-04-07T23:00:53.683 回答