我正在开发一个创建代理虚拟设备(更准确地说是虚拟Xbox 360键盘)的单线程进程小程序;我确实设法使用uinput接口创建它,我正确设置它并且它工作得很好。
为了向这个虚拟设备提供命令,我从另一个真实接口(在本例中为PS3键盘)读取事件,并使用以下标志打开真实设备文件:
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,我是否会在当前循环中引入额外的延迟,从而延迟虚拟垫的响应速度?