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。