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 ...
最新文章
- 2018-3-14智能算法(文章--优化问题的智能算法及其哲学内涵)笔记一(什么是优化问题)
- 如何使Sybase ASE中对象名不区分大小写?
- ubuntu百度网盘下载大文件
- 分布式MySQL数据库TDSQL架构分析
- (附源码gitHub下载地址)spring boot -jta-atomikos分布式事务
- oracle的逻辑结构包括,oracle逻辑结构分析
- Android学习笔记---android数据存储与访问
- python的dict()字典数据类型的方法详解以及案例使用
- iMX8MM启动流程
- vue导出excel文件下载
- Win10改Win7图片查看器|Win10新增加Windows照片查看器
- html怎么让视频自动循环播放,【前端】div 加载视频并自动循环播放
- OA性能调优方案(一)
- java猜拳小游戏心得体会_java实现猜拳小游戏
- 王之泰201771010131《面向对象程序设计(java)》第十周学习总结
- 关联规则-策略挖掘中必不可少的算法
- excel表格打印每页都有表头_如何在Excel打印时每页都有表头?你知道么
- 微信小程序拼团头像叠加css 【亲测有效】
- Java基础语法-环境搭建及入门
- HNUST OJ 2106 普通电梯