select函数的重要特点,每一次都会清除fd

目前和select配合的socket都是阻塞的。
select监控放入 set中的fd,select后,没有相应状态的fd被移除,还在set中的fd,表示可读或者可写,因此能够用 FD_ISSET来判断是否可读或可写。
也因此,每一次select后必须清除所有fd并重新加入要监控的fd。
一下子清晰了。

------------------------------------------------------------------------------------------------------------------------------------
http://bbs.csdn.net/topics/390326583
虽然在网上找了些资料进行了解,但是感觉说法来回就那么几个。
select()监视字符描述符集合。并返回准备就绪的句柄个数。FD_isset有的说是1.测试FD是否存在某个描述符中,2.有的又说是测试集合中的句柄是否准备就绪,如果是第二种说法,那他的作用和select()这个函数有什么区别,那是不是可以在一个程序中不用SELECT而直接FD_isset呢?
所以我想应该第一种说法更准确。但是这样一来,为何要测试FD是否存在某个集合中呢,这样有什么用。我又看到说法,select会将没有就绪的集合清空。

总的问题就是:他们之间到底是一种怎么样的逻辑关系,我想我真的没有理解透彻
我是最近才接触linux编程,问题可能提的不是很好,如果提问的不清楚,也请留言,我再尽力提的清楚点。

你的想法太奇特了,我还没跟上。
比如你1 2 3三个fd,你用select来判断可读可写状态,select返回之后,要么出错,要么超时,要么得到了某些fd的可读可写状态。
假如只1可读,那么2和3已经从fd_set里面去掉了,然后你开始对1 2 3这三个fd以次调用FD_ISSET,如果返回真,说明对应的fd可读。
写同理。






posted @ 2017-11-29 21:41  elseliving的记录  阅读(1316)  评论(0编辑  收藏  举报