没有合适的资源?快使用搜索试试~ 我知道了~
select系统调用时用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句柄有一个或多个发生了状态改变。 关于文件句柄,事实上是一个整数,通过socket函数的声明明确了: int socket(int domain, int type, int protocol); 我们熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,相应的FILE *结构的表示是stdin、stdout、stderr。 继续上面的select,是用来监视某个或某些句柄的状态变化的。select函数原型例如以
资源详情
资源评论
资源推荐
Linux?select具体解释具体解释
select系统调用时用来让我们的程序监视多个文件句柄的状态变化的。程序会停在select这里等待,直到被监视的文件句
柄有一个或多个发生了状态改变。
关于文件句柄,事实上是一个整数,通过socket函数的声明明确了:
int socket(int domain, int type, int protocol);
我们熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,相应的FILE *
结构的表示是stdin、stdout、stderr。
继续上面的select,是用来监视某个或某些句柄的状态变化的。select函数原型例如以下:
int select (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
函数的后一个?数timeout是一个超时时间值。其类型是struct timeval *,即一个struct timeval结构的变量的指针,所以我
们在程序里要声明一个struct timeval tv;然后把变量tv的地址&tv传递给select函数。struct timeval结构例如以下:
struct timeval
{
long tv_sec; //seconds
long tv_usec; //microseconds
};
第2、3、4三个?数是一样的类型;fd_set *,即我们在程序里要申请几个fd_set类型的变量,比方rdfds,wtfds,exfds,然
后把这个变量的地址&rdfds,&wtfds,&exfds传递给select函数。这三个?数都是一个句柄的集合,第一个rdfds是用来保存这
种句柄的:当句柄的状态变成可读时系统告诉select函数返回,同理第二个函数是指向有句柄状态变成可写时系统会告诉select
函数返回,同理第三个?数exfds是特殊情况,即句柄上有特殊情况发生时系统会告诉select函数返回。特殊情况比方对方通过
一个socket句柄发来了紧急数据。假设我们程序里仅仅想检?某个socket是否有数据可读,我们能够这样:
fd_set rdfds;
struct timeval tv;
int ret;
FD_ZERO(&rdfds);
FD_SET(socket, &rdfds);
tv.tv_sec = 1;
tv.tv_uses = 500;
ret = select (socket + 1, %rdfds, NULL, NULL, &tv);
if(ret < 0) perror (“select”);
else if (ret = = 0) printf(“time out”);
else {
printf(“ret = %d/n”,ret);
if(FD_ISSET(socket, &rdfds)){
/* 读取socket句柄里的数据 */
recv( );
}
}
注意select函数的第一个?数,是全部增加集合的句柄值的大那个那个值还要加1.比方我们创建了3个句柄;
int sa, sb, sc;
sa = socket(……);
connect (sa,….);
sb = socket(….);
connect (sb,…);
sc = socket(….);
connect(sc,…);
FD_SET(sa, &rdfds);
FD_SET(sb, &rdfds);
FD_SET(sc, &rdfds);
在使用select函数之前,一定要找到3个句柄中的大值是哪个,我们一般定义一个变量来保存大值,取得大socket值例如
以下:
int maxfd = 0;
if(sa > maxfd) maxfd = sa;
if(sb > maxfd) maxfd = sb;
if(sc > maxfd) maxfd = sc;
然后调用select函数:
ret = select (maxfd+1, &rdfds, NULL, NULL,&tv);
相同的道理,假设我们是检?用户是否按了键盘进行输入,我们应该把标准输入0这个句柄放到select里来检?,例如以
下:
FD_ZERO(&rdfds);
FD_SET(0, &rdfds);
tv.tv_sec = 1;
tv.tv_usec = 0;
ret = select (1, &rdfds,NULL,NULL,&tv);
if(ret < 0) perror(“select”);
else if (ret = = 0) printf (“time out/n”);
weixin_38691739
- 粉丝: 6
- 资源: 958
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0