poll的使用
#define POLL_FD_SIZE 1024
int doServicePoll(int listenFd)
{
struct sockaddr_in cliAddr;
socklen_t len; int i;
struct pollfd pollFdSet[POLL_FD_SIZE];
for(i = ; i < POLL_FD_SIZE; i++) {
pollFdSet[i].fd = -;
}
pollFdSet[].fd = listenFd;
pollFdSet[].events = POLLIN; int pollRet;
int fdNum = ; //表示数组的下标 int acceptFd;
int readNum;
while() {
pollRet = poll(pollFdSet, fdNum + , ); //fdNum + 1表示数组的界限
if(pollRet < ) {
if(errno == EINTR) continue;
ERR_EXIT("poll");
} else if(pollRet == ) {
continue;
}
if(pollFdSet[].revents & POLLIN) { //注意点 是& 而不是==
memset(&cliAddr, , sizeof(cliAddr));
len = sizeof(cliAddr);
if((acceptFd = accept(pollFdSet[].fd, (struct sockaddr *)&cliAddr, &len)) < ) {
ERR_EXIT("accept");
}
printf("recv a connect from %s, port %d, fd %d\n",
inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port), acceptFd);
for(i = ; i < (POLL_FD_SIZE -); i++) {
if(pollFdSet[i].fd == -) {
pollFdSet[i].fd = acceptFd;
pollFdSet[i].events = POLLIN;
if(i > fdNum) {
fdNum = i;
}
break;
}
}
if(i == POLL_FD_SIZE -) {
ERR_EXIT("too many clients!");
}
if(--pollRet == ) continue;
} for(i = ; i < (fdNum +); i++) {
if(pollFdSet[i].fd < ) {
continue;
}
if(pollFdSet[i].revents & POLLIN) { //注意点 是& 而不是==
printf("need recv msg\n");
readNum = handleRead(pollFdSet[i].fd);
if(readNum == READ_ERROR) {
ERR_EXIT("handleRead");
} else if(readNum == READ_CLOSE) {
close(pollFdSet[i].fd);
printf("client closed, remove %d\n", i);
pollFdSet[i].fd = -;
if(i == fdNum) {
fdNum--;
}
}
if(--pollRet == ) {
break;
}
}
}
}
}
注意点:
1 pollFdSet[i].fd == -1 是判断是否需要监听的条件。
2 fdNum是表示监听描述符的个数。
3 判断是否可读 是通过 pollFdSet[i].revents & POLLIN 是否为真来表示的,其他可写等亦如此。
poll的使用的更多相关文章
- select、poll、epoll之间的区别总结
select.poll.epoll之间的区别总结 05/05. 2014 select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪 ...
- (转载) Linux IO模式及 select、poll、epoll详解
注:本文是对众多博客的学习和总结,可能存在理解错误.请带着怀疑的眼光,同时如果有错误希望能指出. 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案 ...
- linux下select/poll/epoll机制的比较
select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSI ...
- select,epoll,poll比较
介绍和比较 http://www.cnblogs.com/maociping/p/5132583.html 比较 http://www.dataguru.cn/thread-336032-1-1.ht ...
- linux poll函数
poll函数与select函数差不多 函数原型: #include <poll.h> int poll(struct pollfd fd[], nfds_t nfds, int timeo ...
- poll机制
使用POLL机制代替linux输入子系统(input subsystem)之按键输入和LED控制中的异步通知,实现同样的效果. 1.代码 只简单修改input_subsys_test.c, input ...
- select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...
- IO多路复用之poll总结
1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...
- select、poll、epoll区别总结
1 本质上都是同步I/O 三者都是I/O复用,本质上都属于同步I/O.因为三者只是负责通知应用程序什么时候数据准备好了,实际的I/O操作还是在由应用程序处理:如果是异步I/O的话,实际I/O由内核处理 ...
- 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制
实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...
随机推荐
- angular - 新建项目 - 2
ng new testNg 新建项目后,从网络上拉取模板(最后缓存下来,我们下次创建项目的时间将会减少80%) 安装过程中,需要我们提供Git账号和姓名 最后,我们进入 useNg 然后,启动服务器 ...
- php错误封装类
1.创建MyErrorHandler.php文件 代码如下: <?php class MyErrorHandler { public $message; public $filename; pu ...
- Python+Selenium框架 ---一个类文件多个测试方法情况下测试固件的写法
我们测试中,肯定需要,打开一个页面,然后测试这个页面的多个用例,才关闭这个页面,去测试其他页面,在unittest是有相关测试固件方法去支持这种行为.请看下面 # coding=utf-8 impor ...
- CentOS Linux搭建独立SVN Server全套流程(转)
环境为centos6.3 1.首先 看看机器上安装了svn了没有 rpm -qa |grep svn 2.如果没有安装 执行 yum -y install subversion 3.安装好了之后 新建 ...
- 轻松搞定RabbitMQ(一)——RabbitMQ基础知识+HelloWorld
转自 http://blog.csdn.net/xiaoxian8023/article/details/48679609 本文是简单介绍一下RabbitMQ,参考官网上的教程.同时加入了一些自己的理 ...
- 编程算法 - 多重部分和问题 代码(C)
多重部分和问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n种不同大小的数字a, 每种各m个. 推断能否够从这些数字之中选出若干使它们的 ...
- 系统安全-SElinux
Selinux是[security-Enhanced Linux]的简称,是美国国家安全局[NSA]和[SCC]开发的Linux的一个扩张强制访问控制安全模块. 因为企业的业务平台的服务器上存储着大量 ...
- Python中十六进制和字符串的转换(转载)
调用Python内置int()函数把该字串转为数字.以下为在Python解释器编程环境下的操作示范: 把十六进制的字串转为十进制数字:Python代码>>> print int('f ...
- 【转】Android IDA 动态调试最完善攻略,跨过各种坑
前提条件和运行环境一定要写清楚,不然会有很多坑,坑死人. (1)IDA 是最新的7.0版本 (2) JDB 使用Java安装目录下的 (3)系统是win10 使用命令窗口时有很大的差别 (4)手机是 ...
- mysql中索引的使用
索引是加速查询的主要手段,特别对于涉及多个表的查询更是如此.本节中,将介绍索引的作用.特点,以及创建和删除索引的语法. 使用索引优化查询 索引是快速定位数据的技术,首先通过一个示例来了解其含义及作用. ...