请教select函数FD_ISSET()函数的作用?

javadong 2007-03-03 08:00:10
以下程序段第5行的select函数和FD_ISSET()函数不太懂,能否解释一下,谢谢?


FD_ZERO(&readfd);
FD_SET(sockfd,&readfd);
while(1){
sin_size=sizeof(struct sockaddr_in);
if(select(MAX_CONNECTED_NO,&readfd,NULL,NULL,(struct timeval *)0)>0){
if(FD_ISSET(sockfd,&readfd)>0){
if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))==-1){
perror("accept");
exit(1);
}
if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))==-1){
perror("recv");
exit(1);
}
if(read(client_fd,buf,MAXDATASIZE)<0){
perror("read");
exit(1);
}
printf("received a connection :%s",buf);
}/*if*/
close(client_fd);
}/*select*/
}/*while*/
...全文
21687 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gatusokaka 2012-04-30
  • 打赏
  • 举报
回复
这个应该得分的



[Quote=引用 6 楼 的回复:]

因为select会修改其中间三个参数,即将没有准备好的socketfd剔除,FD_ISSET的作用就是判断该socketfd是否准备好了。当然如果你只有一个socket的话,不用也行了。

所以你的程序有一个隐患,最好把

引用楼主 javadong 的回复:
FD_ZERO(&readfd);
FD_SET(sockfd,&readfd);





放到循环内部。……
[/Quote]
haipo 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dongjiawei316 的回复:]

因为select会修改其中间三个参数,即将没有准备好的socketfd剔除,FD_ISSET的作用就是判断该socketfd是否准备好了。当然如果你只有一个socket的话,不用也行了。

所以你的程序有一个隐患,最好把

引用楼主 javadong 的回复:
FD_ZERO(&readfd);
FD_SET(sockfd,&readfd);



放到循环内部。……
[/Quote]

受教了!
xiaofan_0204 2010-10-17
  • 打赏
  • 举报
回复
fd_set是文件句柄的集合。

FD_ZERO 清空这个集合;
FD_SET 往这个集合里面加入一个文件句柄;
FD_ISSET 查看某一个文件句柄是否被设置了;

其中,select的第二个参数是“可读”文件句柄的集合;
第三个参数是“可写”文件句柄的集合;经常使用的就是这两个参数。

你可以看一下select函数的说明,里面有的。

'fd_set') 是一组文件描述符(fd)的集合。由于fd_set类型的长度在不同平台上不同,因此应该用一组标准的宏定义来处理此类变量:

fd_set set; FD_ZERO(&set); /* 将set清零 */ FD_SET(fd, &set); /* 将fd加入set */ FD_CLR(fd, &set); /* 将fd从set中清除 */ FD_ISSET(fd, &set); /* 如果fd在set中则真 */

在过去,一个fd_set通常只能包含少于等于32个文件描述符,因为fd_set其实只用了一个int的比特矢量来实现,在大多数情况下,检查 fd_set能包括任意值的文件描述符是系统的责任,但确定你的fd_set到底能放多少有时你应该检查/修改宏FD_SETSIZE的值。*这个值是系统相关的*,同时检查你的系统中的select() 的man手册。有一些系统对多于1024个文件描述符的支持有问题。
harbincampus 2010-02-21
  • 打赏
  • 举报
回复
在单线程服务器程序中使用得比较多,搜搜select的相关知识就知道了。
lianshibo 2010-02-19
  • 打赏
  • 举报
回复
if(select(MAX_CONNECTED_NO,&readfd,NULL,NULL,(struct timeval *)0)> 0)
return: 整数值
参数:第一个:这只是为了和berkley socket兼容, 可以为0
第二个:可读socket集合, 类型:fd_set*
第三个:可写socket集合, 类型:fd_set*
第四个:异常socket集合, 类型:fd_set*
第五个:超时时间,类型:const struct timeval*
wwwhhb4004 2010-01-11
  • 打赏
  • 举报
回复

mark
  • 打赏
  • 举报
回复
简单的说:FD_ISSET是用来判断一个fd,也就是文件描述符是否是满足某种可用条件的。

而select,是用来注册一个操作,这个操作会不停的在其指定的一些文件描述符各自的监听队列里排队,检测其是否满足可读,可写等条件。说穿了,就是为单线程里处理多个描述符,实现IO复用。

http://www.lupaworld.com/151392/viewspace-45283.html
ydy4618 2009-12-20
  • 打赏
  • 举报
回复
FD_ISSET(sockfd,&readfd)
readfd是一个描述符集
若sockfd在readfd中,则返回非0
dongjiawei316 2009-12-20
  • 打赏
  • 举报
回复
当然你这个select是永久等待的,可能不需要
kuaigelajiao 2009-12-19
  • 打赏
  • 举报
回复
积极参与!
dongjiawei316 2009-12-19
  • 打赏
  • 举报
回复
因为select会修改其中间三个参数,即将没有准备好的socketfd剔除,FD_ISSET的作用就是判断该socketfd是否准备好了。当然如果你只有一个socket的话,不用也行了。

所以你的程序有一个隐患,最好把

[Quote=引用楼主 javadong 的回复:]
FD_ZERO(&readfd);
FD_SET(sockfd,&readfd);

[/Quote]
放到循环内部。
eqxu 2007-06-15
  • 打赏
  • 举报
回复
看一下unix网络编程中的select poll这一章。通俗易懂
bobya2003 2007-03-05
  • 打赏
  • 举报
回复
函数说明
select()用来等待文件描述词状态的改变。参数n代表最大的文件描述词加1,参数readfds、writefds 和exceptfds 称为描述词组,是用来回传该描述词的读,写或例外的状况。底下的宏提供了处理这三种描述词组的方式:
FD_CLR(inr fd,fd_set* set);用来清除描述词组set中相关fd 的位
FD_ISSET(int fd,fd_set *set);用来测试描述词组set中相关fd 的位是否为真
FD_SET(int fd,fd_set*set);用来设置描述词组set中相关fd的位
FD_ZERO(fd_set *set); 用来清除描述词组set的全部位

参数
timeout为结构timeval,用来设置select()的等待时间,其结构定义如下
struct timeval
{
time_t tv_sec;
time_t tv_usec;
};

返回值
如果参数timeout设为NULL则表示select()没有timeout。

错误代码
执行成功则返回文件描述词状态已改变的个数,如果返回0代表在描述词状态改变前已超过timeout时间,当有错误发生时则返回-1,错误原因存于errno,此时参数readfds,writefds,exceptfds和timeout的值变成不可预测。
EBADF 文件描述词为无效的或该文件已关闭
EINTR 此调用被信号所中断
EINVAL 参数n 为负值。
ENOMEM 核心内存不足

范例
常见的程序片段:fs_set readset;
FD_ZERO(&readset);
FD_SET(fd,&readset);
select(fd+1,&readset,NULL,NULL,NULL);
if(FD_ISSET(fd,readset){……}
ToWangP 2007-03-04
  • 打赏
  • 举报
回复
楼上说的对,补充一点。

select 函数是实现多路复用的一种方法,在这里的用意主要是不让accept阻塞。

hyg2008 2007-03-04
  • 打赏
  • 举报
回复
select(MAX_CONNECTED_NO,&readfd,NULL,NULL,(struct timeval *)0)作用是设置关注readfd所包含的(句柄)是否有数据可读,你这里就只有sockfd一个。
FD_ISSET是一个宏,不是函数,作用就是检察一下现在是否有数据可读。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧