author:张继飞
FD_ISSET 是select()机制的一个成员而已,网上很多解释都是说FD_ISSET用来检测sockfd是否有动作,对应读,写,异常等,当select()只监听一个sockfd时,表面上看是这样,实际上 非也非也。
FD_ISSET,见名思义,其实就是判断某个sockfd是否在这个fd set集合里。所以,当程序select()监听了多个sockfd后,若select()返回 >0 的话接下来所有的FD_ISSET 都会执行一遍。这样就容易引入问题了,当某个文件描述符fd打开方式是阻塞状态,但此时该fd并没有发生动作,执行read后便会进入阻塞。这就违背了我们设计程序的初衷,所以当使用select()监听多个文件描述符fd时,最好在打开设备时 将其设置为非阻塞状态 O_NONBLOCK。
select处在超时过程中,若程序被kill,则返回值<0。