7.70. V4L2 poll()¶
7.70.1. 名稱¶
v4l2-poll - 等待檔案描述符上的某個事件
7.70.2. 概要¶
#include <sys/poll.h>
-
int poll(struct pollfd *ufds, unsigned int nfds, int timeout)¶
7.70.3. 引數¶
7.70.4. 描述¶
透過 poll() 函式,應用程式可以暫停執行,直到驅動程式捕獲到資料或準備好接受輸出資料。
當協商好流式 I/O 後,此函式會一直等待,直到緩衝區被捕獲裝置填滿,並且可以使用 VIDIOC_DQBUF ioctl 出隊。對於輸出裝置,此函式會一直等待,直到裝置準備好接受一個新的緩衝區,該緩衝區將與 VIDIOC_QBUF ioctl 一起排隊以進行顯示。當緩衝區已經在驅動程式的傳出佇列(捕獲)中,或者傳入佇列未滿(顯示)時,該函式會立即返回。
如果成功,poll() 將返回已選擇的檔案描述符的數量(即,struct pollfd 結構的相應 revents 欄位為非零的檔案描述符)。捕獲裝置在 revents 欄位中設定 POLLIN 和 POLLRDNORM 標誌,輸出裝置設定 POLLOUT 和 POLLWRNORM 標誌。如果函式超時,則返回零值;如果失敗,則返回 -1,並適當地設定 errno 變數。當應用程式沒有呼叫 VIDIOC_STREAMON 時,poll() 函式成功,但在 revents 欄位中設定 POLLERR 標誌。當應用程式已為捕獲裝置呼叫 VIDIOC_STREAMON,但尚未呼叫 VIDIOC_QBUF 時,poll() 函式成功,並在 revents 欄位中設定 POLLERR 標誌。對於輸出裝置,相同的情況也會導致 poll() 成功,但在 revents 欄位中設定 POLLOUT 和 POLLWRNORM 標誌。
如果發生了事件(請參閱 ioctl VIDIOC_DQEVENT),則 POLLPRI 將在 revents 欄位中設定,並且 poll() 將返回。
當協商使用 read() 函式,並且驅動程式尚未捕獲時,poll() 函式將開始捕獲。如果失敗,則如上所述返回 POLLERR。否則,它將等待直到捕獲到資料並且可以讀取。當驅動程式連續捕獲(例如,與靜止影像相對)時,該函式可能會立即返回。
當協商使用 write() 函式,並且驅動程式尚未流式傳輸時,poll() 函式將開始流式傳輸。如果失敗,則如上所述返回 POLLERR。否則,它將等待直到驅動程式準備好進行非阻塞 write() 呼叫。
如果呼叫者只對事件感興趣(只在 events 欄位中設定了 POLLPRI),那麼如果驅動程式尚未流式傳輸,則 poll() 將不會開始流式傳輸。這使得只輪詢事件而不輪詢緩衝區成為可能。
所有實現 read() 或 write() 函式或流式 I/O 的驅動程式也必須支援 poll() 函式。
有關更多詳細資訊,請參閱 poll() 手冊頁。
7.70.5. 返回值¶
如果成功,poll() 將返回具有非零 revents 欄位的結構的數目,如果呼叫超時,則返回零。如果出錯,則返回 -1,並適當地設定 errno 變數
- EBADF
一個或多個
ufds成員指定了一個無效的檔案描述符。- EBUSY
該驅動程式不支援多個讀取或寫入流,並且裝置已在使用中。
- EFAULT
ufds引用了無法訪問的記憶體區域。- EINTR
呼叫被訊號中斷。
- EINVAL
nfds值超過了RLIMIT_NOFILE值。使用getrlimit()來獲取此值。