我针对定义为Linux字符设备的API编写应用程序,其中API的大部分有趣部分定义为ioctl()调用,其中异步事件在驱动程序通过poll()引发POLLPRI时传递给应用程序。我想尝试使用libuv改进应用程序方面。
我尝试过一个驱动程序需要read()调用的设备,因此它会引发POLLIN。我使用了带UV_READABLE的uv_poll_t,这很好。但是,至少有两个设备在改变状态时专门使用POLLPRI。
代码草图:
int fd = open("/dev/..fancy..", O_RDWR);
if (fd < 0) { ... exit or something ... }
int res = ioctl(fd, FANCY_CONFIGURE, ...);
if (res != 0) { ... exit or something ... }
struct pollfd pfd[1] = { fd, POLLPRI, 0 };
int pr = poll(pfd, 1, -1);
if (pr != 1) { ... }
int events;
res = ioctl(fd, FANCY_GET_EVENTS, &events);
// examine events value to see what happened
我从文档和实验中知道,如果驱动程序只引发POLLPRI,,因为规范要求,那么uv_poll_t将无效。
我正在考虑某种准备/检查/异步组合,但是为了使用这个API而构建的其他框架(定制的)使用“大调用轮询”模式,并且也用于处理POLLPRI。我认为如果POLLPRI的民意调查与libuv正在进行的其他任何事情都进行了正确的整合(我对libuv的套接字也有很多用处),那么它会更高效,更愉快。
所以,如果我错过了什么,请告诉我。如果我说对POLLPRI几乎没有直接支持,我想要一些了解libuv方式的人提出的优雅建议。
答案 0 :(得分:1)
目前libuv只设置POLLIN进行阅读。我很好奇并做了一个快速补丁,通过了我们的测试套件并在POLLIN上设置了POLLIN:https://gist.github.com/saghul/5523f8db12a52a2bc12a
没有人要求这样做,所以如果它适用于你,请打开GitHub问题或发送电子邮件到我们的邮件列表。