1.

select第一个参数为最大FD(int)+1,因为虽然select参数里有三个set,但分配到的fd值是不会重复的,当select检查fd可用时(可读或可写或异常),会遍历进程fd表,这时遍历范围为[0,n),所以需要加1

2.

IO复用,类似于时分复用,

摘要:

Select:
  • select 会修改传入的参数数组,这个对于一个需要调用很多次的函数,是非常不友好的。
  • select 如果任何一个sock(I/O stream)出现了数据,select 仅仅会返回,但是并不会告诉你是那个sock上有数据,于是你只能自己一个一个的找,10几个sock可能还好,要是几万的sock每次都找一遍
  • select 只能监视1024个链接, 这个跟草榴没啥关系哦,linux 定义在头文件中的,参见FD_SETSIZE。
  • select 不是线程安全的,如果你把一个sock加入到select, 然后突然另外一个线程发现这个sock不用,要收回。这时,这个select 不支持的,如果关掉这个sock, select的标准行为是不可预测的,文档中中:
      “If a file descriptor being monitored by select() is closed in another thread, the result is unspecified”

Poll:
int poll(struct pollfd fds[], nfds_t nfds, int timeout);
  @param1:
    fds:是一个struct pollfd结构类型的数组
    struct pollfd {
    int fd; /*文件描述符*/
    short events; /* 等待的需要测试事件 */
    short revents; /* 实际发生了的事件,也就是返回结果 */
    };
  @param2:
    nfds:nfds_t类型的参数,用于标记数组fds中的结构体元素的总数量;
  @param3:
    timeout:是poll函数调用阻塞的时间,单位:毫秒;
  @return:  
    >0,正常,就绪描述字的数目
    ==0,超时
    -1,错误
  • poll 去掉了1024个链接的限制,于是要多少链接呢, 主人你开心就好。
  • poll 从设计上来说,不再修改传入数组,不过这个要看你的平台了,所以行走江湖,还是小心为妙。
Epoll:
  • epoll 现在是线程安全的。 
  • epoll 现在不仅告诉你sock组里面数据,还会告诉你具体哪个sock有数据,你不用自己去找了。 

----------------------------------------------
第2点部分内容摘自:
作者:罗志宇
链接:https://www.zhihu.com/question/32163005/answer/55772739
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 posted on 2016-03-20 19:01  Avery-Lyu  阅读(160)  评论(0编辑  收藏  举报