首页 > Linux考试认证

如何有效地使用函数select()

时间:2010-01-30 03:13:44  作者:  我要投稿
Linux初探欢迎您的投稿,投放方法请点击这里查看,我们会定期赠送精美小礼品给优秀的投稿作者。海纳百川 取则行远!LinuxGoo欢迎您的到来。
select()函数主要是建立在fd_set类型的基础上的。fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_se......

  select()函数主要是建立在fd_set类型的基础上的。fd_set(它比较重要所以先介绍一下)是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:

  fd_set set;

  FD_ZERO(&set); /* 将set清零使集合中不含任何fd*/

  FD_SET(fd, &set); /* 将fd加入set集合 */

  FD_CLR(fd, &set); /* 将fd从set集合中清除 */

  FD_ISSET(fd, &set); /* 测试fd是否在set集合中*/

  过去,一个fd_set通常只能包含<32的fd(文件描述字),因为fd_set其实只用了一个32位矢量来表示fd;现在,UNIX 系统通常会在头文件<sys/select.h>中定义常量FD_SETSIZE,它是数据类型fd_set的描述字数量,其值通常是 1024,这样就能表示<1024的fd。根据fd_set的位矢量实现,我们可以重新理解操作fd_set的四个宏:

  fd_set set;

  FD_ZERO(&set); /*将set的所有位置0,如set在内存中占8位则将set置为00000000*/

  FD_SET(0, &set); /* 将set的第0位置1,如set原来是00000000,则现在变为10000000,这样fd==1的文件描述字就被加进set中了 */

  FD_CLR(4, &set); /*将set的第4位置0,如set原来是10001000,则现在变为10000000,这样fd==4的文件描述字就被从set中清除了 */

  FD_ISSET(5, &set); /* 测试set的第5位是否为1,如果set原来是10000100,则返回非零,表明fd==5的文件描述字在set中;否则返回0*/

  ―――――――――――――――――――――――――――――――――――――――

  注意fd的最大值必须<FD_SETSIZE。

  ―――――――――――――――――――――――――――――――――――――――

  select函数的接口比较简单:

  int select(int nfds, fd_set *readset, fd_set *writeset,

  fd_set* exceptset, struct timeval *timeout);

如果您需转载 如何有效地使用函数select(),请注明来自LinuxGoo.com,其版权归原作者所有。请广大网友留言时遵纪守法,使用文明用语。如果您在应用中有什么问题,请在下面留言,我们会尽快解答。
来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目热门