如何从 Linux /dev/input/eventX 轮询输入

Posted

技术标签:

【中文标题】如何从 Linux /dev/input/eventX 轮询输入【英文标题】:How to poll input from Linux /dev/input/eventX 【发布时间】:2019-05-28 15:24:26 【问题描述】:

我正在开展一个项目,该项目需要我在 Scientific Linux 6.4(Linux 内核 2.6.32)上运行触摸屏。虽然内核不完全支持触摸屏,但当我触摸屏幕时,我可以看到在触摸屏的 /dev/input/eventX 位置生成多点触控事件。

我正在尝试编写一个简单的 C++ 程序来读取 /dev/input/eventX 文件中的数据并对其进行解析,以便我可以手动处理多点触控事件,因为似乎是我让这个工作的唯一方法。

于是我写了如下程序:

std::ifstream input("/dev/input/event10");
if(input.is_open()) 
    while(input.good()) 
        int header;
        input >> header;

        cout << std::hex << header << " ";

        int data[16] = ;
        for(int i = 0; i < 16; i++) 
            input >> data[i];
            cout << std::hex << data[i] << " ";
        

        cout << endl;
    

    input.close();
 else cout << "Unable to open event handler for input polling..." << endl;

现在,我不完全知道我读取和解析输入本身的方法是否正确,但是当我在 bash 中使用以下命令时:

sudo cat /dev/input/event10 | hexdump -C

我以多行的形式获取输入数据,以 8 位十六进制值开头,后跟 16 个 2 位十六进制值(字节)。

我遇到的问题是我总是收到消息“无法打开用于输入轮询的事件处理程序...”,这表明打开文件时出现问题。起初,我想可能是因为在生成事件之前该文件中没有任何内容,因此它可能无法作为 ifstream 打开。我还尝试以 sudo 运行程序,以防万一这是权限问题并收到相同的消息,所以我相信这与我打开文件的方式有关。

有人知道打开和读取这些文件的正确方法吗?

编辑:我的问题是关于为什么文件无法打开,不一定只是如何解析数据。建议的“重复”问题在这方面没有提供任何有用的信息。

【问题讨论】:

Read from /dev/input的可能重复 也相关:How do you read the mouse button state from /dev/input/mice? @scohe001 我也读了这两本书,但我的问题是为什么文件无法打开,因为这两个问题都涉及 C,而不是 C++,所以它们在这里对我没有帮助. @DarinBeaudreau:好的。如果是这样的话,我认为这个问题应该被关闭,所以这个案例有一个密切的原因(简单的印刷错误)。顺便说一句,如果某些系统调用失败,我们可以将错误打印给用户,这是一件好事。我不确定 ifstream 是否可以可靠地报告错误(以记录的方式)。 也意味着你的minimal reproducible example 不是一个! 【参考方案1】:

没关系...我的文件名中有一个尾随空格(检测到而不是硬编码)。我添加了一个修剪功能,现在它可以正常打开了。

【讨论】:

以上是关于如何从 Linux /dev/input/eventX 轮询输入的主要内容,如果未能解决你的问题,请参考以下文章

如何从Linux源码创建RPM或DEB包

linux如何从远程终端下载文件到本地磁盘?

如何从 Linux 终端找到特定文件?

如何从Linux源码获知版本信息

如何从 Linux 中的用户空间访问物理地址?

如何从 PHP 脚本运行 linux 命令 [重复]