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. 参数¶
7.72.4. 描述¶
通过 select()
函数,应用程序可以暂停执行,直到驱动程序捕获到数据或准备好接受用于输出的数据。
当已协商流式 I/O 时,此函数会等待,直到缓冲区被填充或显示,并且可以使用 VIDIOC_DQBUF ioctl 进行出队。当缓冲区已在驱动程序的传出队列中时,该函数会立即返回。
成功时,select()
返回 fd_set
中设置的总位数。当函数超时时,它将返回零值。失败时,它返回 -1,并且会适当地设置 errno
变量。当应用程序未调用 ioctl VIDIOC_QBUF, VIDIOC_DQBUF 或 ioctl VIDIOC_STREAMON, VIDIOC_STREAMOFF 时,select()
函数会成功,在 readfds
或 writefds
中设置文件描述符的位,但是后续的 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
readfds
、writefds
、exceptfds
或timeout
指针引用了无法访问的内存区域。- EINTR
调用被信号中断。
- EINVAL
nfds
参数小于零或大于FD_SETSIZE
。