【发布时间】:2017-06-14 16:32:23
【问题描述】:
我正在开发一个 单线程 进程小程序,它创建一个代理虚拟设备(更准确地说是一个虚拟 Xbox 360 键盘);我确实设法使用uinput 界面创建它,我正确设置它并且它工作得很好。
为了向这个虚拟设备提供命令,我从另一个真实界面(在本例中为PS3 pad)读取事件,我用这些标志打开 real device 文件:
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, &ev, sizeof(struct input_event));
}
您可以想象read(fd, &ev, sizeof(struct input_event)); 是一个阻塞调用,我希望有一种超时来循环循环并检查其他事件/执行其他代码。
出于这些原因,我正在考虑将 read(fd... 调用封装在 epoll 循环中,这样我也可以有一个超时。
问题是,这样做是否有效? 通过使用epoll_wait,我是否会在当前循环中引入额外的延迟,从而延迟虚拟键盘的响应?
【问题讨论】:
标签: linux event-handling linux-device-driver epoll uinput