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
字段中设置 POLLIN
和 POLLRDNORM
标志,输出设备设置 POLLOUT
和 POLLWRNORM
标志。如果函数超时,则返回零值;如果失败,则返回 -1,并适当地设置 errno
变量。当应用程序没有调用 VIDIOC_STREAMON 时,poll()
函数成功,但在 revents
字段中设置 POLLERR
标志。当应用程序已为捕获设备调用 VIDIOC_STREAMON,但尚未调用 VIDIOC_QBUF 时,poll()
函数成功,并在 revents
字段中设置 POLLERR
标志。对于输出设备,相同的情况也会导致 poll()
成功,但在 revents
字段中设置 POLLOUT
和 POLLWRNORM
标志。
如果发生了事件(请参阅 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()
来获取此值。