当前位置: 首页 > 面试题库 >

linux uinput:简单示例?

袁雅逸
2023-03-14
问题内容

我有一些问题让 双方 使用的代码边uinput工作。

基于uinput入门:用户级别输入子系统[死链接;存档 ]我总结了以下 作家 (减去错误处理):

int main(int ac, char **av)
{
    int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
    int ret = ioctl(fd, UI_SET_EVBIT, EV_ABS);
    ret = ioctl(fd, UI_SET_ABSBIT, ABS_X);

    struct uinput_user_dev uidev = {0};
    snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-rotary");
    uidev.absmin[ABS_X] = 0;
    uidev.absmax[ABS_X] = 255;
    ret = write(fd, &uidev, sizeof(uidev));
    ret = ioctl(fd, UI_DEV_CREATE);

    struct input_event ev = {0};
    ev.type = EV_ABS;
    ev.code = ABS_X;
    ev.value = 42;

    ret = write(fd, &ev, sizeof(ev));

    getchar();

    ret = ioctl(fd, UI_DEV_DESTROY);
    return EXIT_SUCCESS;
}

这似乎可行,至少input_event似乎已编写了完整的结构。

然后,我写出了我最能想到的事件的天真的 读者

int main(int ac, char **av)
{
    int fd = open(av[1], O_RDONLY);

    char name[256] = "unknown";
    ioctl(fd, EVIOCGNAME(sizeof(name)), name);
    printf("reading from %s\n", name);

    struct input_event ev = {0};
    int ret = read(fd, &ev, sizeof(ev));
    printf("Read an event! %i\n", ret);
    printf("ev.time.tv_sec: %li\n", ev.time.tv_sec);
    printf("ev.time.tv_usec: %li\n", ev.time.tv_usec);
    printf("ev.type: %hi\n", ev.type);
    printf("ev.code: %hi\n", ev.code);
    printf("ev.value: %li\n", ev.value);

    return EXIT_SUCCESS;
}

不幸的是,读者方面根本无法工作。每次只能读取8个字节,这几乎不是完整的input_event结构。

我犯了什么愚蠢的错误?


问题答案:

您还应该在实际事件之后编写一个同步事件。在您的编写方代码中:

struct input_event ev = {0};
ev.type = EV_ABS;
ev.code = ABS_X;
ev.value = 42;

usleep(1500);

memset(&ev, 0, sizeof(ev));
ev.type = EV_SYN;
ev.code = 0;
ev.value = 0;

ret = write(fd, &ev, sizeof(ev));

getchar();


 类似资料:
  • 本文向大家介绍webpack Webpack简单示例,包括了webpack Webpack简单示例的使用技巧和注意事项,需要的朋友参考一下 示例 使用Webpack的最低要求是以下命令: Web pack将获取源文件,编译到输出目标并解决源文件中的所有依赖关系。

  • 由于在某些嵌入式系统中使用的是Android系统,这里给出一个简单的Android App的示例,具体代码可以从clone自https://github.com/phodal/iot-android 代码说明,经过测试的版本有 Android 2.3 Android 4.0.4 机型有 HTC G1 (android 2.3) Motor xt300 (android 2.3) Sony ST25

  • 问题内容: 任何人都可以给我一个简单的nodeJs回调示例,我已经在许多网站上进行了搜索,但无法正确理解,请给我一个简单的示例。 我想做这样的事情… 问题答案: 现在打开节点或浏览器控制台,并粘贴以上定义。 最后在下一行中使用它: 关于节点样式错误约定 Costa问如果我们要遵守节点错误回调约定,会是什么样子。 按照这种约定,回调应期望至少收到一个参数(第一个参数)作为错误。根据上下文,我们可以选

  • 问题内容: 谁能分享使用信号量的简单示例?如果可能的话,可以在没有信号量的情况下解决任务,然后再通过信号量来了解任务的主要思想。 问题答案: 这是一个简单的信号量实现: 该方法发送一个信号,该信号内部存储在信号量中。该方法等待信号。接收到信号标志后,再次将其清除,然后退出该方法。 阅读本文并看一下这个例子

  • 主要内容:创建JDBC应用程序,示例代码本文章教程中将演示如何创建一个简单的JDBC应用程序的示例。 这将显示如何打开数据库连接,执行SQL查询并显示结果。 这个示例代码中涉及所有步骤,一些步骤将在本教程的后续章节中进行说明。 创建JDBC应用程序 构建JDBC应用程序涉及以下六个步骤 - 导入包:需要包含包含数据库编程所需的JDBC类的包。 大多数情况下,使用就足够了。 注册JDBC驱动程序:需要初始化驱动程序,以便可以打开与数据库的

  • 本文向大家介绍android音乐播放简单实现的简单示例(MediaPlayer),包括了android音乐播放简单实现的简单示例(MediaPlayer)的使用技巧和注意事项,需要的朋友参考一下 利用MediaPlayer完成一个最简单的音乐播放。这个基本的控制掌握后,可直接利用为背景乐的控制。 为了能够实现播放,在界面方面,我们需要三个控制按钮,分别是:Play(播放)、Pause(暂停)、St