select系统调用

1 #include <sys/select.h>   
2 int select(int maxfdps, fd_set *readset, fd_set *writeset, fd_set *exceptset,struct timeval *timeout);

  maxfdps:被监听的文件描述符(fd)的数量;

  readset:结构指针类型(readset指向一个结构体),该结构体仅包含一个内置的整型数组,表示可读事件对应的fd集合,该数组中的每一位(bit)标记一个fd。由于fd集合是用内置数组表示的,所以能够容纳的fd的数量有限,限制了select能够同时处理的fd的数量;
  writeset(可写事件),exceptset(异常事件)同上;
  timeout:结构指针类型,设置select函数的超时时间,该结构体包含两个long型变量,分别表示表示秒数和微秒数。

1 struct timeval
2 {
3     long tv_sec; //秒数
4     long tv_usec; //微秒数
5 };

  返回值:给timeout的两个成员变量均传递0,select立即返回;传递NULL,select一直阻塞,直到某个fd就绪或者程序捕获到一个信号时,select才返回。
      select成功,返回就绪的fd(含可读,可写和异常事件对应的fd)的数量(超时时间内没有fd就绪,返回0);
      select失败,返回-1。

  采用一系列宏来访问fd_set中的位:

1 #include <sys/select.h>   
2 int FD_ZERO(int fd, fd_set *fdset);   //清除所有位,置0int FD_CLR(int fd, fd_set *fdset);   //清楚某一位fd,置0
3 int FD_SET(int fd, fd_set *fd_set);   //设置某一位fd,置1
4 int FD_ISSET(int fd, fd_set *fdset); //测试某一位fd是否被置1

   应用程序调用select函数时,传入感兴趣的fd(对应的位置1,不感兴趣的置0)和超时时间,select调用返回时,内核修改fd_set数组通知应用程序哪些fd已经就绪(对应的位置1,未准备就绪的置0),通过遍历数组,来轮询检测就绪事件;修改timeval的成员通知应用程序阻塞了多久。

  调用顺序:FD_ZERO,清空fd集合;FD_SET,设置感兴趣的fd;select,监视就绪的fd;FD_ISSET,检测就绪事件。

 

 

 

原文地址:https://www.cnblogs.com/yongjin-hou/p/14348786.html