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