C 程式設計/POSIX 參考/unistd.h/select
外觀
select 是一個 系統呼叫 和 應用程式程式設計介面 (API) 用於 類 Unix 和 POSIX 相容的作業系統,用於檢查 檔案描述符 的狀態,即開啟的輸入/輸出通道。select 系統呼叫類似於 UNIX System V 及其後來的作業系統中引入的 poll 功能。
在 C 程式語言 原始碼中,select 系統呼叫在標頭檔案 sys/select.h 或 unistd.h 中宣告,語法如下
int select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* errorfds, struct timeval* timeout);
| 引數 | 描述 |
|---|---|
| nfds | 所有集合中最大檔案描述符加 1 |
| readfds | fd_set 型別,包含要檢查是否可讀的檔案描述符,並在輸出中指示哪些檔案描述符可讀。可以為 NULL。 |
| writefds | fd_set 型別,包含要檢查是否可寫檔案描述符,並在輸出中指示哪些檔案描述符可寫。可以為 NULL。 |
| errorfds | fd_set 型別,包含要檢查是否有待處理的錯誤條件的檔案描述符,並在輸出中指示哪些檔案描述符有待處理的錯誤條件。可以為 NULL。 |
| timeout | struct timeval 型別結構,指定選擇完成的最大等待時間間隔。如果 timeout 引數指向一個成員為 0 的 struct timeval 型別物件,select() 不會阻塞。如果 timeout 引數為 NULL,select() 將阻塞,直到事件導致其中一個掩碼返回一個有效(非零)值。 |
fd_set 型別 引數可以使用四個實用程式宏進行操作:FD_SET()、FD_CLR()、FD_ZERO() 和 FD_ISSET()。
Select 返回 readfds、writefds 和 errorfds 中設定的位總數,如果超時則返回 0,如果出錯則返回 -1。
select 中使用的檔案描述符集的大小是有限的,具體取決於作業系統。更新的系統呼叫 poll 提供了更靈活的解決方案。