为了账号安全,请及时绑定邮箱和手机立即绑定

请问关于select()函数是怎样运行的?

/ 猿问

请问关于select()函数是怎样运行的?

交互式爱情 2019-09-20 19:14:08

select()函数是怎样运行的


查看完整描述

5 回答

?
白衣非少年

应该只有一个socket队列,每个socket对象上有3个状态
select遍历队列中的所有套接字,检查套接字中各个状态,发现有可用状态就回调相应的函数
select需要遍历所有的套接字,这就是是跟异步通信(linux下的epoll,windows下的完成端口)最大的区别,异步通信由操作系统通知那个套接字有可用状态,然后直接回调相应函数,不需要去遍历所有的socket

查看完整回答
反对 回复 2019-09-22
?
HUWWW

timeout=null时select将无限期阻塞直到最少一个socket轮询到
timeout=TIMEVAL结构时
如果timeval为{0,0}则轮询到一个socket立即返回
其他值则代表轮询的最大时间限制

查看完整回答
反对 回复 2019-09-22
?
aluckdog

select的目的: 我想你应该知道,recv,read,scanf这类函数是阻塞函数,也就是说没有得到数据是不会返回的,这就造成了一个问题,程序执行到这些函数里面的时候就一直等待,而这个时候如果要有其他的操作根本得不到响应。select函数就是为了解决

查看完整回答
反对 回复 2019-09-22
?
慕哥9229398

SELECT( ) ——是测试工作区函数;
SELECT(3):意思是返回当前的工作区号,至于SELECT(3)的返回值为0,你再仔细看下题
你只写select(3)的返回值怎么是0,我也无法准确解释

查看完整回答
反对 回复 2019-09-22
?
qq_花开花谢_0


int select (int maxfdp1, fd_set *readset, fd_set *writeset,   fd_set *exceptset, const struct timeval * timeout);   Return >0:就绪描述字的正数目   -1:出错   0 :超时   struct timeval{   long tv_sec; // seconds   long tv_usec; // microseconds   }   1. 永远等下去:仅在有一个描述字准备好I/O时返回。置为NULL   2. 等待一段固定时间:在有一个描述字准备好I/O时返回,但不超过由该参数所指向的timeval结构中指定的秒数和微秒数。   3. 不等待:检查完描述字后立即返回,称之为轮询(polling)。该参数必须指向一共timeval结构,其中的定时器值为0(秒数和微秒数)。   readset writeset exceptset指定我们要让内核测试读、写和异常条件的描述字。如果对某一个的条件不感兴趣,就可以把它设为NULL。如果三个指针都为NULL,我们就有了一个比sleep()函数更为精确的定时器(sleep()以秒为最小单位,这个以微妙为单位)。


查看完整回答
反对 回复 2019-09-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信