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