9.19. select()
檢查 sockets descriptors 是否就緒可讀或可寫
函式原型
說明
select() 函式讓你可以同步檢查多個 sockets,檢查它們是否有資料需要接收,或者是否你可以送出資料而不會發生 blocking,或者是否有例外發生。
你可以使用如上述的 FD_SET() macros(巨集)來調整 socket descriptors set。
如果你想要知道 set 上的哪些 sockets 有資料可以接收(就緒可讀),則將這個 set 放在 readfds 參數;
如果你想要知道 set 上的哪些 sockets 有資料可以傳送(就緒可寫),則將這個 set 放在 writefds 參數;
若你想知道哪些 sockets 有例外(錯誤)發生,則可以將 set 擺在 exceptfds 參數。
沒興趣知道的事件可以將 select() 相對應的參數設定為 NULL。
在 select() 返回之後,這些 sets 的值會改變,用以標示哪些 sockets 是就緒可讀、可寫,及有例外發生等事件。
第一個參數 n 的值是最大的那個 socket descriptor 數值在加上 1。
最後,struct timeval 可以設定 timeout 的時間,用來告訴 select() 要等待多久的時間。 select() 會在有任何事件發生或 timeout 之後返回。struct timeval 有兩個欄位:tv_sec 設定秒(second)、tv_usec 設定微秒(microsecond)[一秒鐘有 1,000,000 微秒]。
用到的 macros 功能如下:
FD_SET(int fd, fd_set *set); 將 fd 新增至 set。
FD_CLR(int fd, fd_set *set); 從 set 中移除 fd。
FD_ISSET(int fd, fd_set *set); 若 fd 在 set 中則傳回 true。
FD_ZERO(fd_set *set); 將 set 清為零。
傳回值
成功時傳回 set 中的 descriptors 數量,若發生 timeout 時傳回 0,錯誤時傳回 -1(並設定相對應的 errno),還有,sets 會被改過,用以表示哪幾個 sockets 是已經就緒的。
範例
參考
poll()
Last updated