select()函数使用

select() 函数允许程序监视多个文件描述符,等待一个或多个文件描述符为某类I/O操作变为“就绪”。

/* According to POSIX.1-2001 */
#include 

/* According to earlier standards */
#include 
#include 
#include 

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

你可能感兴趣的:(linux)