0

我针对定义为 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 将不起作用。

我正在考虑某种 prep/check/async 组合,但是为使用此 API 而构建的其他框架(定制的)使用“大调用轮询”模式,并且也旨在处理 POLLPRI。我认为,如果 POLLPRI 的民意调查与 libuv 正在进行的其他任何事情正确集成(而且我也对 libuv 的套接字有很多用途),它会更有效、更愉快。

所以如果我错过了什么,请告诉我。如果我对 POLLPRI 几乎没有直接支持是正确的,我希望了解 libuv 的人提供一些优雅的建议。

4

1 回答 1

1

目前 libuv 只设置 POLLIN 进行读取。我很好奇并做了一个快速补丁,它通过了我们的测试套件并在 Linux 上将 POLLPRI 与 POLLIN 一起设置:https ://gist.github.com/saghul/5523f8db12a52a2bc12a

从来没有人要求过这个,所以如果它适合你,请打开一个 GitHub 问题或发送电子邮件到我们的邮件列表。

于 2015-01-09T10:03:06.207 回答