7.72. V4L2 select()

7.72.1. 名称

v4l2-select - 同步 I/O 多路复用

7.72.2. 概要

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)

7.72.3. 参数

nfds

三个集合中任何一个集合中最高编号的文件描述符,加 1。

readfds

要监视的文件描述符,如果调用 read() 不会阻塞。

writefds

要监视的文件描述符,如果 write() 不会阻塞。

exceptfds

要监视 V4L2 事件的文件描述符。

timeout

最大等待时间。

7.72.4. 描述

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

当协商了流式 I/O 时,此函数会等待直到缓冲区已填充或显示,并且可以使用 VIDIOC_DQBUF ioctl 进行出队。当缓冲区已在驱动程序的传出队列中时,该函数会立即返回。

成功时,select() 返回 fd_set 中设置的总位数。当函数超时时,它将返回值零。 失败时,它返回 -1 并且 errno 变量被适当设置。 当应用程序未调用 ioctl VIDIOC_QBUF, VIDIOC_DQBUFioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF 时,select() 函数成功,设置 readfdswritefds 中文件描述符的位,但后续 VIDIOC_DQBUF 调用将失败。[1]

当协商了 read() 函数的使用并且驱动程序尚未捕获时,select() 函数开始捕获。 如果失败,select() 返回成功并且后续 read() 调用(也尝试开始捕获)将返回适当的错误代码。 当驱动程序连续捕获(与例如静止图像相反)并且数据已可用时,select() 函数立即返回。

当协商了 write() 函数的使用时,select() 函数仅等待直到驱动程序准备好进行非阻塞 write() 调用。

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

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

7.72.5. 返回值

成功时,select() 返回三个返回的描述符集中包含的描述符数量,如果超时到期,则该数量将为零。 错误时,返回 -1,并且 errno 变量被适当设置; 集合和 timeout 未定义。 可能的错误代码是

EBADF

一个或多个文件描述符集指定了未打开的文件描述符。

EBUSY

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

EFAULT

readfdswritefdsexceptfdstimeout 指针引用了无法访问的内存区域。

EINTR

该调用被信号中断。

EINVAL

nfds 参数小于零或大于 FD_SETSIZE