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 中指定負值表示無限超時。 可以在 events 和 revents 中設定/返回的位在 <poll.h> 中定義
標籤 | 描述 |
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 中不提供此常量。參見
廣告
|