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函数深入理解相关推荐

  1. 对于\n冲刷缓冲区,对Linux中fork()函数的理解

    首先今天写了两道感觉一模一样的fork题目,都是输出_的,结果一个题目输出8个_,一个题目输出6个_,我看了许久,才发现一点点的不同,于是去Linux系统下自己编译了两个cpp文件,果然,现在贴上图: ...

  2. linux poll 作用,Linux中poll机制的理解

    首先分析下应用程序的执行过程: int main(int argc, char **argv) { int fd; unsigned char key_val; int ret; struct pol ...

  3. linux内核err实现,Linux中IS_ERR()函数的理解

    在Linux源码中的fs部分,经常会碰到这样的函数(位于kernel/include/linux/fs.h): /* * Kernel pointers have redundant informat ...

  4. linux启动程序api编程,Linux编程中关于API函数与系统调用间关系

    用户态xyz()函数,内核最终一般会调用形如sys_xyz()的服务例程来处理(不过也有一些例外,这里暂时不考虑) 函数xyz()是直接提供给用户编程使用的.图中"SYSCALL" ...

  5. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  6. 对linux中多线程编程中pthread_join的理解

    对linux中多线程编程中pthread_join的理解 分类: 程序员面试 linux学习2013-08-04 21:32 234人阅读 评论(0) 收藏 举报 多线程linuxpthread_jo ...

  7. linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2

    Linux:dup和dup2文件描述符及函数解析,dupdup2 一.文件描述符 1.1 文件描述符概念 我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符 ...

  8. linux基础(1)-常见指令及权限理解

    1.常见指令及权限理解 初始Linux操作系统 初识shell命令 ,了解若干背景知识. 使用常用Linux命令 了解Linux权限概念与思想,能深度理解"权限" 初步了解Linu ...

  9. linux getline参数,Linux下的getline函数

    最近在做国嵌的mp3项目,在mp3主控程序中用到了这个函数,挺好使的,在这里记录一下.注意是linux下的,不是C++中的. 函数原型 ssize_t getline(char **lineptr, ...

  10. Linux 下调用UEFI的函数

    Linux 下调用UEFI的函数 摘要 Linux 调用UEFI function 时候调用约定的转换 64bits calling convention Microsoft calling conv ...

最新文章

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

热门文章

  1. 谷歌调整排序算法引发震荡 知名网站PR值下滑
  2. Unity开发日记【第八天】——音效与对话框
  3. 基于高速相机的近地落点三维坐标测试方法
  4. 在线教育实现高效益游戏化运营
  5. SWOT分析法的4个分析维度 4种组合策略 26个问题清单,知己知彼!
  6. 遨博机械臂——使用官方demo控制真实机械臂
  7. LeetCode 83 —— 删除排序链表中的重复元素
  8. DirectX12交换链、深度缓冲
  9. JAVASE常用方法浅谈。学如逆水行舟, 不进则退
  10. MySQL高级特性之分布式(XA)事务的介绍