linux开发2-网络编程二之多路复用
操作函数
FD_CLR
将一个文件描述符从监听集合中移除。
void FD_CLR(int fd,fd_set *set);
FD_ISSET
判断一个文件描述符是否在监听集合中。
int FD_ISSET(int fd,fd_set *set);
返回值:1存在,0不存在。
FD_SET
将待监听的文件描述符,添加到监听集合中。
void FD_SET(int fd,fd_set *set); //把前面的fd设置到后面的fd_set中,将fd对应的标志位设置为1
fd_set rdset;
FD_SET(fd,&rdset); //把fd描述符放到检测集合reset中。
FD_ZERO
清空一个文件描述符集合。
void FD_ZERO(fd_set *set); //将set集合中所有文件描述符对应的标志位设置为0,集合中没有添加任何文件描述符。
//例子
fd_set reset;
FD_ZERO(&reset);
select
int select(int nfds,fd_set *readfds,fd_set *writefds,fd_set *execptfds,struct timeval *timeout);
//例子
while(1)
{
int num = select(maxfd+1,&retemp,NULL,NULL,NULL);
}
- nfds:监控的文件描述符集里最大文件描述符+1,因为此参数会告诉内核检测前多少个文件描述符的状态。
- readfds:监控有读数据文件描述符的集合,传入传出参数。
- writefds:监控写数据到达文件描述符集合,传入传出参数。
- execptfds:监控异常发生到达文件描述符集合,如带外数据到达异常,传入传出参数。
- timeout:定时阻塞监控时间,3种情况:
- NULL,永远等待,阻塞监听。
- 设置timeval,等待固定时间
- 设置timeval里时间均为0,检查描述字后立即返回,轮询。
返回值:
- 大于0所有监听集合(3个)中,满足对应事件的总数。
- 0 没有满足监听条件的文件描述符。
- -1 错误error。
fd_set
它有1024个标志位。对应相应的文件描述符表。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具