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() 来获取此值。