select()函數使用

select() 函數允許程序監視多個文件描述符,等待一個或多個文件描述符爲某類I/O操作變爲“就緒”。

/* According to POSIX.1-2001 */
#include <sys/select.h>

/* According to earlier standards */
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

int select(int nfds, fd_set *readfds, fd_set *readfds, fd_set *exceptfds, struct timeval *timeout);

參數解析:

  • nfds:是三組中任何一組中(readfds、writefds、exceptfds)編號最大的文件描述符,加1;
  • readfds、readfds、exceptfds:分別代表文件描述符集合中是否有可讀、可寫以及異常的文件描述符;
  • timeout:則表示等待時間;

fd_set 是一組文件描述符(fb)的集合,它用一位來表示一個fd,對於 fd_set 類型通過下面四個宏來操作:

	void FD_ZERO(fd_set *set);
	void FD_SET(int fd, fd_set *set);
	void FD_CLR(int fd, fd_set *set);
	int  FD_ISSET(int fd, fd_set *set);
  • FD_ZERO:將指定的文件描述符集清空,在對文件描述符集合進行設置前,必須對其進行初始化,如果不清空,由於在系統分配內存空間後,通常並不作清空處理,所以結果是不可知的;
  • FD_SET:用於在文件描述符集合中增加一個新的文件描述符;
  • FD_CLR:用於在文件描述符集合中刪除一個文件描述符;
  • FD_ISSET:測試以查看文件描述符是否是集合的一部分,這在select()函數返回後很有用;

同時需要注意一點,在 select() 函數返回之後,函數參數(readfds、writefds、exceptfds)的值都將改變,其中,這些文件描述符集合中,可讀、可寫、異常的文件描述符的bit將置1,其他置0,所以,在select()函數返回後,通過 FD_ISSET 測試fb是否在可操作集合中,然後可針對該fb進行相應的操作。
還可以通過 select() 函數實現延時,具體的操作,可以百度。

詳細參考文章

雨奇:select()函數以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章