7.70. V4L2 poll()

7.70.1. 名称

v4l2-poll - 等待文件描述符上的某个事件

7.70.2. 概要

#include <sys/poll.h>
int poll(struct pollfd *ufds, unsigned int nfds, int timeout)

7.70.3. 参数

7.70.4. 描述

通过 poll() 函数,应用程序可以暂停执行,直到驱动程序捕获到数据或准备好接受用于输出的数据。

当协商使用流式 I/O 时,此函数会等待直到捕获设备填充了缓冲区,并且可以使用 VIDIOC_DQBUF ioctl 将其出队。对于输出设备,此函数会等待直到设备准备好接受一个新的缓冲区,该缓冲区将使用 VIDIOC_QBUF ioctl 排队以进行显示。当缓冲区已经在驱动程序的输出队列(捕获)中,或者输入队列未满(显示)时,该函数会立即返回。

成功时,poll() 返回已选择的文件描述符的数量(即,struct pollfd 结构中相应的 revents 字段非零的文件描述符)。捕获设备在 revents 字段中设置 POLLINPOLLRDNORM 标志,输出设备设置 POLLOUTPOLLWRNORM 标志。当函数超时时,它返回零值,失败时返回 -1,并且会相应地设置 errno 变量。当应用程序未调用 VIDIOC_STREAMON 时,poll() 函数会成功,但在 revents 字段中设置 POLLERR 标志。当应用程序为捕获设备调用了 VIDIOC_STREAMON 但尚未调用 VIDIOC_QBUF 时,poll() 函数会成功,并在 revents 字段中设置 POLLERR 标志。对于输出设备,同样的情况也会导致 poll() 成功,但它会在 revents 字段中设置 POLLOUTPOLLWRNORM 标志。

如果发生事件(请参见 ioctl VIDIOC_DQEVENT),则 POLLPRI 将在 revents 字段中设置,并且 poll() 将返回。

当协商使用 read() 函数,并且驱动程序尚未捕获时,poll() 函数会开始捕获。如果失败,它会像上面一样返回一个 POLLERR。否则,它会等待直到捕获到数据并且可以读取。当驱动程序连续捕获(与例如静态图像相反)时,该函数可能会立即返回。

当协商使用 write() 函数,并且驱动程序尚未进行流式传输时,poll() 函数会开始流式传输。如果失败,它会像上面一样返回一个 POLLERR。否则,它会等待直到驱动程序准备好进行非阻塞的 write() 调用。

如果调用者只对事件感兴趣(仅在 events 字段中设置了 POLLPRI),那么如果驱动程序尚未进行流式传输,则 poll()不会开始流式传输。这使得可以仅轮询事件,而不轮询缓冲区。

所有实现 read()write() 函数或流式 I/O 的驱动程序也必须支持 poll() 函数。

有关更多详细信息,请参见 poll() 手册页。

7.70.5. 返回值

成功时,poll() 返回具有非零 revents 字段的结构数量,如果调用超时则返回零。如果出错,则返回 -1,并且会相应地设置 errno 变量

EBADF

一个或多个 ufds 成员指定无效的文件描述符。

EBUSY

驱动程序不支持多个读取或写入流,并且该设备已在使用中。

EFAULT

ufds 引用不可访问的内存区域。

EINTR

该调用被信号中断。

EINVAL

nfds 值超过 RLIMIT_NOFILE 值。使用 getrlimit() 获取此值。