淺談IO多路複用

這篇文章主要講述select的使用,selcet的優點在於, 它是POSIX所規定的, 所有正常的操作系統都是有的。 說白了, 就是通用, 通用, 通用

select

原型

/**
* @param {int} nfds 需要檢查的文件描述符個數
* @param {fd_set*} readset 用來檢查可讀性的一組文件描述符
* @param {fd_set*} writeset 用來檢查可寫性的一組文件描述符
* @param {fd_set*} exceptset 用來檢查是否有異常的一組文件描述符
* @param {timeval*} 超時時間, 填寫NULL的時候表示堵塞,
填寫0為非堵塞,其他為超時時間
* @retun {int} 發生錯誤時,返回SOCKET_ERROR
**/
int select(int nfds, fd_set* readset, fd_set* writeset, fd_set* exceptset, struct timeval* timeout)

fd_set

fd_set其實是一個數組的宏定義, 實際上是一個long類型的數組, 存放的是文件描述符(文件句柄)

  • FD_SET //添加文件描述符
  • FD_CLR // 清空文件描述符
  • FD_ISSET // 判斷對應的文件描述符是否存在
  • FD_ZERO //將fd_set 全部清零

範例 1

FD_SET(int fd, fd_set *fdset); //將fd加入set集合
FD_CLR(int fd, fd_set *fdset); //將fd從set集合中清除
FD_ISSET(int fd, fd_set *fdset); //檢測fd是否在set集合中,不在則返回0
FD_ZERO(fd_set *fdset); //將set清零使集合中不含任何fd
 


分享到:


相關文章: