select、poll、epoll用法、原理、区别

本文详细介绍了Linux下的I/O多路复用技术,包括select、poll和epoll的用法、原理及其区别。select在文件描述符数量有限制,需要轮询;poll通过链表结构克服了数量限制,但仍有拷贝问题;epoll利用红黑树和回调机制,解决了前两者的问题,支持高效的工作模式。
摘要由CSDN通过智能技术生成

一、select

概念

select使内核挂起进程,当一个/多个IO事件发生后, 控制权返还给应用程序,由应用程序进行IO的处理

参数

int select(int maxfd, fd_set *readset, fd_set *writeset, 
			fd_set *exceptset, const struct timeval *timeout);
返回值:为就绪数目,出错为-1,超时为0

maxfd:待测试的最大描述符+1
readset:读描述符集合
writeset:写描述符集合
exceptset:异常描述符集合
timeout:超时时间,为空一直等,为0立即返回,为正等待一段时间

fd_set集合函数

设置描述符集合相关函数,其中的每个元素都是二进制中的0或者1:a[maxfd-1], ..., a[1], a[0]
void FD_ZERO(fd_set *fdset);      	//所有元素设为0
void FD_SET(int fd, fd_set *fdset);  	//a[fd]设为1
void FD_CLR(int fd, fd_set *fdset);   //a[fd]设为0
int  FD_ISSET(int fd, fd_set *fdset);	//a[fd]是否为1

用法

fd_set readmask;	// 每次实际传入的(因为select会改变readmask,所以需要allreads还原)
fd_set allreads;	// 用于还原readmask,每次将allreads赋给readmask
FD_ZERO(&allreads);	// 清空allreads
FD_SET(0, &allreads); // 0加入监听
FD_SET(socket_fd,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值