多路IO转接(二):poll

一、poll函数说明

int poll(struct pollfd *fds, nfds_t nfds, int timeout);

	fds:监听的文件描述符【数组】

		struct pollfd {
			
			int fd:	待监听的文件描述符
			
			short events:	待监听的文件描述符对应的监听事件

											取值:POLLIN、POLLOUT、POLLERR

			short revnets:	传入时, 给0。如果满足对应事件的话, 返回 非0 --> POLLIN、POLLOUT、POLLERR
		}

	nfds: 监听数组的,实际有效监听个数。

	timeout:  > 0:  超时时长。单位:毫秒。

		  -1:	阻塞等待

		  0:  不阻塞

	返回值:返回满足对应监听事件的文件描述符 总个数。

二、poll特点

poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。

它没有最大连接数的限制,原因是它是基于链表来存储的,但是同样有一个缺点:

1、大量的fd的数组被整体复制于用户态和内核地址空间之间,而不管这样的复制是不是有意义。

2、poll还有一个特点是“水平触发”,如果报告了fd后,没有被处理,那么下次poll时会再次报告该fd。

参考链接
select、poll、epoll之间的区别(搜狗面试)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值