标签:set 函数 tv fd 事件 原理 select socket
select函数原理
linux编程中select函数用于检测一组socket上是否有事件就绪,这里的事件包括可读、可写、异常事件,其中读事件就绪是指发生以下几种情况:
1. socket内核接收缓冲区的字节数大于等于低水位标记SO_RCVLOWAT,此时可调用read或recv无阻塞的读取文件描述符,且read/recv返回值大于0。
2. TCP连接对端关闭连接,此时本端调用read或recv进行读操作,返回0。
3. 监听socket上有新的连接请求。
4. socket有未处理的错误。
写事件就绪是指发生以下几种情况:
1. socket内核发送缓冲区空闲字节数大于等于低水位标记SO_SNDLOWAT时,可以进行无阻塞的写操作,且写操作返回值大于0。
2. socket写操作被关闭(调用close或者shutdown)
3. socket使用非阻塞connect连接成功或失败。
函数签名如下:
int select(int nfds, fd_set *readset, fd_set *writeset, fd_set *exceptset, struct timeval *timeout);
参数说明:
nfds: 一般设置为最大fd的值加1
接下来三个参数分别表示要监听的可读/可写/异常事件的集合
最后一个参数表示超时时间,超时后select函数返回。timeval的定义如下:
struct timeval
{
long tv_sec; // 秒
long tv_usec; // 微秒
}
如果tv_sec和tv_usec都设置为0, 则select立即返回。
fd_set是一个整型数组,其中每一个bit标记一个关注的事件,有几个宏定义可用于设置或检测fd_set:
FD_ZERO(fd_set *fdset) // 将fd_set中的所有bit置0
FD_SET(int fd, fd_set *fdset) // 设置值为fd的描述符对应的事件为关注事件
FD_ISSET(int fd, fd_set *fdset) // 检测值为fd的描述符对应的事件是否就绪
使用select检测就绪事件需要注意一点:每次select返回之后,fd_set中的数据会失效,需要重新设置,超时时间也是如此。
标签:set,函数,tv,fd,事件,原理,select,socket 来源: https://blog.csdn.net/Nekoluo/article/details/122648068
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。