linux poll in,Linux poll函数深入理解
poll函数与select函数差不多
函数原型:
#include
int poll(struct pollfd fd[], nfds_t nfds, int timeout);
struct pollfd的结构如下:
structpollfd{int fd; //文件描述符
short event;//请求的事件
short revent;//返回的事件
}
每个pollfd结构体指定了一个被监视的文件描述符。第一个参数是一个数组,即poll函数可以监视多个文件描述符。每个结构体的events是监视该文件描述符的事件掩码,由用户来设置。revents是文件描述符的操作结果事件,内核在调用返回时设置。events中请求的任何事件都可能在revents中返回。合法的事件如下:
后三个只能作为描述字的返回结果存储在revents中,而不能作为测试条件用于events中。
这些事件在events域中无意义,因为它们在合适的时候总是会从revents中返回。使用poll()和select()不一样,你不需要显式地请求异常情况报告。
POLLIN | POLLPRI等价于select()的读事件,POLLOUT |POLLWRBAND等价于select()的写事件。POLLIN等价于POLLRDNORM |POLLRDBAND,而POLLOUT则等价于POLLWRNORM。
例如,要同时监视一个文件描述符是否可读和可写,我们可以设置 events为POLLIN |POLLOUT。在poll返回时,我们可以检查revents中的标志,对应于文件描述符请求的events结构体。如果POLLIN事件被设置,则文件描述符可以被读取而不阻塞。如果POLLOUT被设置,则文件描述符可以写入而不导致阻塞。这些标志并不是互斥的:它们可能被同时设置,表示这个文件描述符的读取和写入操作都会正常返回而不阻塞。
第二个参数nfds:要监视的描述符的数目。
timeout参数指定等待的毫秒数,无论I/O是否准备好,poll都会返回。timeout指定为负数值表示无限超时;timeout为0指示poll调用立即返回并列出准备好I/O的文件描述符,但并不等待其它的事件。这种情况下,poll()就像它的名字那样,一旦选举出来,立即返回。
成功时,poll()返回结构体中revents域不为0的文件描述符个数;如果在超时前没有任何事件发生,poll()返回0;失败时,poll()返回-1,并设置errno为下列值之一:
EBADF:一个或多个结构体中指定的文件描述符无效。
EFAULT:fds指针指向的地址超出进程的地址空间。
EINTR:请求的事件之前产生一个信号,调用可以重新发起。
EINVAL:nfds参数超出PLIMIT_NOFILE值。
ENOMEM:可用内存不足,无法完成请求。
demo:
#include #include#include#include#include#include#include#include
#define MAX_BUFFER_SIZE 1024
#define IN_FILES 3
#define TIME_DELAY 60*5
#define MAX(a,b) ((a>b)?(a):(b))
int main(int argc ,char **argv)
{structpollfd fds[IN_FILES];charbuf[MAX_BUFFER_SIZE];inti,res,real_read, maxfd;
fds[0].fd = 0;if((fds[1].fd=open("data1",O_RDONLY|O_NONBLOCK)) < 0)
{
fprintf(stderr,"open data1 error:%s",strerror(errno));return 1;
}if((fds[2].fd=open("data2",O_RDONLY|O_NONBLOCK)) < 0)
{
fprintf(stderr,"open data2 error:%s",strerror(errno));return 1;
}for (i = 0; i < IN_FILES; i++)
{
fds[i].events=POLLIN;
}for(i=0;i
{
fds[i].events=POLLIN;
}while(fds[0].events || fds[1].events || fds[2].events)
{if (poll(fds, IN_FILES, TIME_DELAY) <= 0)
{
printf("Poll error\n");return 1;
}for (i = 0; i< IN_FILES; i++)
{if(fds[i].revents)
{
memset(buf,0, MAX_BUFFER_SIZE);
real_read=read(fds[i].fd, buf, MAX_BUFFER_SIZE);if (real_read < 0)
{if (errno !=EAGAIN)
{return 1;
}
}else if (!real_read)
{
close(fds[i].fd);
fds[i].events= 0;
}else{if (i == 0)
{if ((buf[0] == 'q') || (buf[0] == 'Q'))
{return 1;
}
}else{
buf[real_read]= '\0';
printf("%s", buf);
}
}
}
}
}
exit(0);
}
linux poll in,Linux poll函数深入理解相关推荐
- 对于\n冲刷缓冲区,对Linux中fork()函数的理解
首先今天写了两道感觉一模一样的fork题目,都是输出_的,结果一个题目输出8个_,一个题目输出6个_,我看了许久,才发现一点点的不同,于是去Linux系统下自己编译了两个cpp文件,果然,现在贴上图: ...
- linux poll 作用,Linux中poll机制的理解
首先分析下应用程序的执行过程: int main(int argc, char **argv) { int fd; unsigned char key_val; int ret; struct pol ...
- linux内核err实现,Linux中IS_ERR()函数的理解
在Linux源码中的fs部分,经常会碰到这样的函数(位于kernel/include/linux/fs.h): /* * Kernel pointers have redundant informat ...
- linux启动程序api编程,Linux编程中关于API函数与系统调用间关系
用户态xyz()函数,内核最终一般会调用形如sys_xyz()的服务例程来处理(不过也有一些例外,这里暂时不考虑) 函数xyz()是直接提供给用户编程使用的.图中"SYSCALL" ...
- Linux 编程中的API函数和系统调用的关系【转】
转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...
- 对linux中多线程编程中pthread_join的理解
对linux中多线程编程中pthread_join的理解 分类: 程序员面试 linux学习2013-08-04 21:32 234人阅读 评论(0) 收藏 举报 多线程linuxpthread_jo ...
- linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2
Linux:dup和dup2文件描述符及函数解析,dupdup2 一.文件描述符 1.1 文件描述符概念 我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符 ...
- linux基础(1)-常见指令及权限理解
1.常见指令及权限理解 初始Linux操作系统 初识shell命令 ,了解若干背景知识. 使用常用Linux命令 了解Linux权限概念与思想,能深度理解"权限" 初步了解Linu ...
- linux getline参数,Linux下的getline函数
最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...
- Linux 下调用UEFI的函数
Linux 下调用UEFI的函数 摘要 Linux 调用UEFI function 时候调用约定的转换 64bits calling convention Microsoft calling conv ...
最新文章
- asp.net获取网站路径
- 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个...
- 操作系统(十四)进程调度的时机、调度方式
- Objecttive-C 创建多线程
- Centos安装后的一些必要处理工作
- 对象必须实现 iconvertible。_java面向对象最全入门笔记(通俗易懂,适合初学者)...
- K-近邻算法(KNN)概述
- html中style布局放哪,CSS样式表与格式布局详解
- Java之一致性hash算法原理及实现
- php mysql sqlite3_PHP连接SQLite数据库
- 机器学习分类问题中_训练数据类别不均衡怎么解决
- 注意细节:Javascript中的变量作用域
- linux下二进制包、源代码包、rpm包
- 可视化:小型有向网络HTML自动生成器
- 跑分软件测试的游戏是,扔掉跑分软件 开启游戏测评2.0时代
- python爬虫批量下载图片
- 蚁群算法解决tsp问题python_蚁群算法在解决TSP问题中的应用
- 【全网最全面】SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决,提交PR)...
- 基于Matlab的脉冲多普勒雷达仿真
- 甲方安全开源项目收集
热门文章
- 攻防世界MISC新手区 give_you_flag
- Ubuntu 16.04 LTS版本部署Virtualmin
- 在线教育实现高效益游戏化运营
- java里localtime,java 时间转换之LocalDate,LocalTime ,LocalDateTime
- css3实现 slideUp/slideDown效果
- SpringCloud链路追踪SkyWalking-第四章-自定义链路追踪
- 麻将高效鬼牌胡牌算法(C++版)
- (二)使用Navicat将mssql数据库数据迁移到PostgreSql
- 【机器学习】<刘建平Pinard老师博客学习记录>机器学习算法的随机数据生成
- 恭喜!密码学家王小云获未来科学大奖,百万美元奖金