I/O的多路轉接: select

來源:互聯網
上載者:User

1. 概念:

     I/O多路轉接技術, 是先構造一張有關描述符的列表, 然後調用一個函數, 直到這些描述符中的一個已準備好進行I/O時, 該函數才返回. 在返回時, 它告訴進程哪些描述符已經準備好可以進行I/O.

    在Linux下poll, pselect, select這三個函數都可以執行I/O多路轉接操作, 今天我們主要說select函數.

 

2. select函數:

#include <sys/select.h>

int select(int maxfdp1, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict exceptfds,
               struct timeval *restrict tvptr);

正常則返回準備就緒的描述符數, 逾時則返回0, 出錯則返回-1.

下面對參數進行說明:

  • maxfdp1: MAX File Description Plus 1. 最大描述符+1.
  • tvptr: 等待時間, 用一個timeval結構的值表示, 有3種情況:
    • tvptr == NULL: 永遠等待. 可被訊號中斷.
    • tvptr->tv_sec == 0 && tvptr->tv_usec == 0: 完全不等待, 測試所有指定的描述符並立即返回. 非阻塞輪詢.
    • tvptr->tv_sec != 0 &7 tvptr->tv_usec != 0: 等待指定的時間數. 時間超過立即返回0. 可被訊號中斷.
  • readfds, writefds, exceptfds: 指向描述符集的指標, 分別是可讀, 可寫, 異常的描述符. 每個描述符集存放在一個fd_set資料類型中.

 

fd_set可進行以下3種處理:

  • 分配一個這種類型的變數.
  • 將這種類型的一個變數賦值給同類型的另一個變數.
  • 其他處理.

關於其他處理, 由以下幾個宏來實現:

#include <sys/select.h>

/* 判斷fd是否在描述符集fdset中 */
int FD_ISSET(int fd, fd_set *fdset);

在則返回非0, 不在則返回0.

 

#include <sys/select.h>

/* 將一指定位清楚 */
void FD_CLR(int fd, fd_set *fdset);

/* 設定fd_set變數的一個指定位為fd */
void FD_SET(int fd, fd_set *fdset);

/* 將fdset的所有位設定為0 */
void FD_ZERO(fd_set *fdset);

 

3. 說明:

    前面我們所說的"準備好", 具體地說是指:

  • 若對讀集(readfds)中的一個描述符的read操作將不會阻塞, 則此描述符是準備好的.
  • 若對寫集(writefds)中的一個描述符的write操作將不會阻塞, 則此描述符是準備好的.
  • 若異常狀態集(exceptfds)中的一個描述符有一個未決異常狀態, 則此描述符是準備好的. 現在, 異常狀態包括:
    • 在網路連接上到達的帶外資料.
    • 在處於資料包模式的偽終端上發生了某些狀態.

    描述符的阻塞是否並不影響select的阻塞. 也就是說, 這是兩種阻塞層關係, 比如: 讀一個非阻塞描述符, 並且以逾時值5s調用select, 則select最多阻塞5s. 又比如: 指定一個tvptr = NULL 來調用select, 則該描述符資料準備好或捕捉到一個訊號之前, select是一直阻塞的.

 

4. pselect:

    POSIX.1 定義了一個select的變體, 即: pselect, 對於這個函數不多介紹, 只說一下和select的兩點區別:

  • 逾時結構, select用timeval, pselect用const timespec. 這使得時間更精確, 並且不會被修改.
  • pselect可使用一可選擇的訊號屏蔽字sigmask. 在調用pselect時, 以原子操作的方式安裝該訊號屏蔽字, 在返回時恢複以前的訊號屏蔽字.

 

5. 執行個體:

    編寫中, 等待添加...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.