poll() - Unix,Linux系統呼叫
廣告
名稱poll, ppoll - 等待檔案描述符上的某些事件概要
#include <poll.h>
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
#define _GNU_SOURCE
#include <poll.h>
int ppoll(struct pollfd *fds, nfds_t nfds,
const struct timespec *timeout, const sigset_t *sigmask);
|
描述
poll() 執行與 select(2) 類似的任務:它等待一組檔案描述符中的一個準備好執行 I/O。要監視的檔案描述符集在 fds 引數中指定,這是一個包含 nfds 個以下形式的結構體的陣列
struct pollfd {
int fd; /* file descriptor */
short events; /* requested events */
short revents; /* returned events */
};
|
fd 欄位包含開啟檔案的 檔案描述符。events 欄位是輸入引數,一個位掩碼,指定應用程式感興趣的事件。 revents 欄位是輸出引數,核心用實際發生的事件填充它。revents 中返回的位可以包含在 events 中指定的任何位,或 POLLERR、POLLHUP 或 POLLNVAL 之一。(這三個位在 events 欄位中沒有意義,並且每當相應條件為真時,將在 revents 欄位中設定它們。) 如果對於任何檔案描述符都沒有發生任何請求的事件(以及沒有錯誤),則 poll() 將阻塞,直到發生其中一個事件。 timeout 引數以毫秒為單位指定 poll() 將阻塞的超時上限。在 timeout 中指定負值表示無限超時。 可以在 <poll.h> 中定義在 events 和 revents 中可以設定/返回的位。
| 標籤 | 描述 |
|
POLLIN | 有資料要讀取。 |
|
POLLPRI | | | 有緊急資料要讀取(例如,TCP 套接字上的帶外資料;偽終端主控端在分組模式下已看到從端的狀體改變)。 |
|
POLLOUT | | | 現在寫入不會阻塞。 |
|
POLLRDHUP (自 Linux 2.6.17 起) | | | 流式套接字對端關閉連線,或關閉連線的寫入半部分。必須定義 _GNU_SOURCE 功能測試宏才能獲得此定義。 |
|
POLLERR | | | 錯誤條件(僅輸出)。 |
|
POLLHUP | | | 掛起(僅輸出)。 |
|
POLLNVAL | | | 無效請求:fd 未開啟(僅輸出)。 |
使用定義的 _XOPEN_SOURCE 編譯時,還可以使用以下內容,它們除了上面列出的位之外沒有傳達更多資訊
| 標籤 | 描述 |
|
POLLRDNORM | | | 等效於 POLLIN。 |
|
POLLRDBAND | | | 可以讀取優先順序帶資料(通常在 Linux 上未使用)。 |
|
POLLWRNORM | | | 等效於 POLLOUT。 |
|
POLLWRBAND | | | 可以寫入優先順序資料。 |
Linux 也知道 POLLMSG,但不使用它。
ppoll()poll() 和 ppoll() 之間的關係類似於 select() 和 pselect() 之間的關係:與 pselect() 一樣,ppoll() 允許應用程式安全地等待,直到檔案描述符變為就緒或捕獲訊號。除了 timeout 引數的差異外,以下 ppoll() 呼叫
ready = ppoll(&fds, nfds, timeout, &sigmask);
|
等效於 *原子地* 執行以下呼叫
sigset_t origmask;
sigprocmask(SIG_SETMASK, &sigmask, &origmask);
ready = ppoll(&fds, nfds, timeout);
sigprocmask(SIG_SETMASK, &origmask, NULL);
|
有關 ppoll() 為何必要的原因,請參閱 pselect(2) 的說明。 timeout 引數指定 ppoll() 將阻塞的時間上限。此引數是指向以下形式的結構體的指標
struct timespec {
long tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
|
如果 timeout 指定為 NULL,則 ppoll() 可以無限期阻塞。 返回值成功時,返回正數;這是具有非零 revents 欄位的結構體數量(換句話說,那些報告事件或錯誤的描述符)。值為 0 表示呼叫超時且沒有檔案描述符就緒。出錯時,返回 -1,並相應設定 errno。錯誤
| 標籤 | 描述 |
|
EBADF | 在一組集合中給出了無效的檔案描述符。 |
|
EFAULT | 作為引數給出的陣列不包含在呼叫程式的地址空間中。 |
|
EINTR | 在任何請求的事件之前發生訊號。 |
|
EINVAL | nfds 值超過 RLIMIT_NOFILE 值。 |
|
ENOMEM | 沒有空間分配檔案描述符表。 |
Linux說明Linux ppoll() 系統呼叫會修改其 timeout 引數。但是,glibc 包裝器函式透過使用傳遞給系統呼叫的超時引數的區域性變數來隱藏此行為。因此,glibc ppoll() 函式不會修改其 timeout 引數。錯誤請參閱 select(2) 的 BUGS 部分中關於虛假就緒通知的討論。符合標準
poll() 符合 POSIX.1-2001。ppoll() 是 Linux 特定的。版本poll() 系統呼叫是在 Linux 2.1.23 中引入的。poll() 庫呼叫是在 libc 5.4.28 中引入的(如果您的核心沒有 poll() 系統呼叫,則提供使用 select() 的模擬)。ppoll() 系統呼叫是在核心 2.6.16 中新增到 Linux 中的。ppoll() 庫呼叫是在 glibc 2.4 中新增的。 備註某些實現使用值為 -1 的非標準常量 INFTIM 作為 timeout。glibc 中未提供此常量。參見
廣告
|