如何在 Unix 中从键盘设备捕获用户输入?

问题描述 投票:0回答:2

我想从键盘设备捕获所有用户输入,一次读取一个字节。我编写了以下代码,但它不起作用:

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

我预计终端会等待输入,但它没有。

linux keyboard driver device
2个回答
15
投票

键盘设备本身是

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

如果您正在运行 GUI 应用程序,则低级方法是调用

XNextEvent
以及同一系列中的其他函数。解码输入事件并不完全是微不足道的,因为它取决于应用程序来应用修饰符。 GUI 框架(Motif、Gtk、Qt...)会对您有所帮助。

如果您正在运行终端应用程序,请从标准输入或从

/dev/tty
读取(
/dev/tty
始终是程序运行的终端,即使标准输入已被重定向)。您需要将终端置于“原始模式”。您将获得解码的字符键和功能键(主要是转义序列)。在这方面,图书馆也能有所帮助;事实上的标准是ncurses


2
投票

如果您正在寻找的是终端中的无缓冲输入,则

tcsetattr()

就是您正在寻找的 - 您需要将终端置于非规范模式,即将终端标志设置为不包含

ICANON
- 请参阅例如
此代码片段
。请参阅 man termios(或函数名称,它通常链接到 Linux 上的同一手册页)。

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

© www.soinside.com 2019 - 2024. All rights reserved.