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