加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 将epoll用于设备(??/ dev / event / …)是否有效?

发布时间:2020-12-14 01:40:58 所属栏目:Linux 来源:网络整理
导读:我正在开发一个单线程的进程applet,它创建一个代理虚拟设备(更确切地说是一个虚拟的Xbox 360 pad);我确实设法使用 uinput界面创建它,我正确设置它,它工作得很好. 为了向这个虚拟设备提供命令,我从另一个真实接口(在这种情况下是PS3 pad)中读取事件,然后用这
我正在开发一个单线程的进程applet,它创建一个代理虚拟设备(更确切地说是一个虚拟的Xbox 360 pad);我确实设法使用 uinput界面创建它,我正确设置它,它工作得很好.

为了向这个虚拟设备提供命令,我从另一个真实接口(在这种情况下是PS3 pad)中读取事件,然后用这些标志打开真实的设备文件:

fd = open("/dev/input/event22",O_RDONLY); // open the PS3 pad

主循环类似于(减去错误检查):

while(run) {
    input_event ev = {0};
    read(fd,&ev,sizeof(struct input_event));
    // convert from PS3 --> Xbox 360
    convert(ev);
    // write to the new virtual pad
    write(fd_virtual,sizeof(struct input_event));
}

你可以想象读(fd,& ev,sizeof(struct input_event));是一个阻塞调用,我希望有一种超时循环循环并检查其他事件/执行其他代码.

由于这些原因,我正在考虑封装该读取(fd …在epoll循环内调用,所以我也可以暂停.

问题是,以这种方式完成它会有效吗?
由于使用epoll_wait,我是否在当前循环中引入了额外的延迟,从而延迟了虚拟键盘的响应速度?

解决方法

By virtue of using epoll_wait,am I introducing additional delays to the current loop,thus delays in responsiveness of the virtual pad?

是的,你确定.

would it be efficient to have it done this way?

我确定是的,但这在很大程度上取决于你对“有效”的定义.

我们在这里谈论的是人类输入设备.在处理HID时我们最关心的是延迟,它不应该滞后,对按键的反应应该是即时的.什么是人类的“即时”?有一个很好的discussion there,但我最喜欢的一个论点是,在一场高水平的田径比赛中你会在信号发出后不到100毫秒内开始disqualified.

但是,100毫秒是对输入信号进行整体处理的时间预算,从按键到游戏中的一些可感知的变化. Wikipedia page on input lag有关于这笔预算通常如何花费的数字.

无论如何,我认为1 ms是绝对安全的开销,你可以添加你的代理,没有人会注意到,让我们说这是我们的最大延迟目标(如“高效”的定义).

因此,我们假设您对当前代码的响应时间感到满意.添加epoll()调用时会发生什么变化?基本上,你正在为另一个系统调用添加一些时间,因为现在而不是一个系统调用来获得你正在制作两个的值.因此,它可能比原始代码慢两倍(让我们忘记目前不同系统调用的处理时间差异).但它真的那么糟糕吗?

要回答这个问题,我们需要对系统调用开销有一些估计.如果我们懒得自己测量它,我们可以使用一些numbers from 20 years ago,一些numbers from people that care about syscalls,一些IPC numbers from microkernel guys (they always care),一些random numbers from StackOverflow或just ask Rich,并作为一个安全的假设安定在微秒级.

因此,问题可归结为是否在毫秒(如1000μs)时间预算内添加一些(甚至可以说是10)微秒是显而易见的.我认为不是.

当你要从“只添加epoll()”开始时,只有一个小问题

cycle through the loop and check for other events/execute other code.

您需要小心保持这些循环和检查的时间预算.但是再说1 ms对你来说可能已经足够了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读