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
。