poll函数和select函数非常相似,但是函数接口不一样。

  int poll(struct pollfd fdarray[], nfds_t nfds, int timeout);

  int select(int maxfdp1, fd_set *restrict readfds, fd_set *restrict expectfds, struct timeval * restrict tvptr);

  其中poll函数中,结构pollfd如下:

  struct pollfd{

    int fd; //file descriptor

    short event;//event of interest on fd

    short revent;//event that occurred on fd

  }

  

  每一个pollfd结构体指定了一个被监视的文件描述符,可以传递多个结构体,指示poll()监视多个文件描述符。每个结构体的events域是监视该文件描述符的事件掩码,由用户来设置这个域。revents域是文件描述符的操作结果事件掩码。内核在调用返回时设置这个域。events域中请求的任何事件都可能在revents域中返回。


合法的事件如下:
POLLIN
有数据可读。
POLLRDNORM
有普通数据可读。
POLLRDBAND
有优先数据可读。
POLLPRI
有紧迫数据可读。
POLLOUT
写数据不会导致阻塞。
POLLWRNORM
写普通数据不会导致阻塞。
POLLWRBAND
写优先数据不会导致阻塞。
POLLMSG
SIGPOLL 消息可用。

此外,revents域中还可能返回下列事件:
POLLER
指定的文件描述符发生错误。
POLLHUP
指定的文件描述符挂起事件。
POLLNVAL
指定的文件描述符非法。


这些事件在events域中无意义,因为它们在合适的时候总是会从revents中返回。使用poll()和select()不一样,你不需要显式地请求异常情况报告。
POLLIN | POLLPRI等价于select()的读事件,POLLOUT |POLLWRBAND等价于select()的写事件。POLLIN等价于POLLRDNORM |POLLRDBAND,而POLLOUT则等价于POLLWRNORM。
例如,要同时监视一个文件描述符是否可读和可写,我们可以设置 events为POLLIN |POLLOUT。在poll返回时,我们可以检查revents中的标志,对应于文件描述符请求的events结构体。如果POLLIN事件被设置,则文件描述符可以被读取而不阻塞。如果POLLOUT被设置,则文件描述符可以写入而不导致阻塞。这些标志并不是互斥的:它们可能被同时设置,表示这个文件描述符的读取和写入操作都会正常返回而不阻塞。
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
可用内存不足,无法完成请求。


poll函数退出后,struct pollfd变量的所有值被清零,需要重新设置。


下面给出一个实例程序说明用法:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*文件控制*/
#include <sys/select.h>
#include <sys/time.h> /*时间方面的函数*/
#include <errno.h> /*有关错误方面的宏*/
#include<sys/poll.h> //poll()
#include<fcntl.h>
#include<string.h> //memset()int main(void)
{int fd,key_value,ret;struct pollfd event; //创建一个struct pollfd结构体变量,存放文件描述符、要等待发生的事件fd=open("/dev/key",O_RDWR); if(fd<0){perror("open /dev/key error!\n");exit(1);}printf("open /dev/key sucessfully!\n");while(1){ //poll结束后struct pollfd结构体变量的内容被全部清零,需要再次设置memset(&event,0,sizeof(event)); //memst函数对对象的内容设置为同一值event.fd=fd; //存放打开的文件描述符event.events=POLLIN; //存放要等待发生的事件ret=poll((struct pollfd *)&event,1,5000); //监测event,一个对象,等待5000毫秒后超时,-1为无限等待//判断poll的返回值,负数是出错,0是设定的时间超时,整数表示等待的时间发生if(ret<0){printf("poll error!\n");exit(1);}if(ret==0){printf("Time out!\n");continue;}if(event.revents&POLLERR){ //revents是由内核记录的实际发生的事件,events是进程等待的事件printf("Device error!\n");exit(1);}if(event.revents&POLLIN){read(fd,&key_value,sizeof(key_value));printf("Key value is '%d'\n",key_value);}}close(fd);return 0;
}

UNIX中的Poll函数相关推荐

  1. UNIX中的Select函数

    表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unistd.h> 定义函数 int sel ...

  2. c++中的fork函数_fork函数

    复刻(fork,又译作派生.分支)是UNIX或类UNIX中的分叉函数,fork函数将运行着的程序分为2个(几乎)完全一样的进程,每个进程都启动一个从代码的同一位置开始执行的线程.这两个进程中的线程继续 ...

  3. UNIX网络编程——select函数的并发限制和 poll 函数应用举例

    http://blog.csdn.net/chenxun_2010/article/details/50489577 一.用select实现的并发服务器,能达到的并发数,受两方面限制 1.一个进程能打 ...

  4. 第6章 I/O复用 select 和 poll 函数

    I/O 复用的能力: 如果一个或多个 I/O 条件满足(例如,输入已准备好被读,或者描述字可以承接更多的输出)时,我们就被通知到. I/O 复用由函数 select 和 poll 支持. I/O 复用 ...

  5. I/O多路转接之poll 函数

    http://blog.csdn.net/li_ning_/article/details/52167224 poll 一.poll()函数: 这个函数是某些Unix系统提供的用于执行与select( ...

  6. js中立即执行函数会预编译吗_作为前端你了解JavaScript运行机制吗?

    作为前端工程师,大家都知道js是前端一开始就要学会的知识点,js的代码你会写了,那js的运行机制你了解吗?只有了解了js的运行机制,才能在工作中如鱼得水,今天就跟随珠峰的老师一起来了解下js的运行机制 ...

  7. C语言 IO多路复用——poll函数

    友链 gcc 1.c -o 1 -lpthread ctrl+f搜索服务端代码和客户端代码获取代码 该方法也可以实现并发服务器 IO多路复用,IO多路转接 简介 IO多路复用中的IO并不是指单纯的标准 ...

  8. C++回调函数中调用Python函数出现的死锁问题调试及解决

    一.查找死锁原因: 1.使用gdb exe指令进入gdb命令行,再输入r运行可执行文件 gdb /home/sdhm/catkin_ws/devel/lib/gpd_ros/gpd_server GN ...

  9. php中年月日用什么参数,PHP中date()日期函数参数整理

    PHP中date()日期函数参数整理 发布于 2014-11-19 13:34:06 | 105 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...

最新文章

  1. C++字符串数组排序技巧
  2. CSS教程:div垂直居中的N种方法以及多行文本垂直居中的方法
  3. 吴裕雄 oracle PL/SQL编程
  4. ROS知识【11-1】:建立用户自己的工作空间、功能包
  5. Android中的多种文件读写操作方法
  6. Linux学习之十二-Linux文件属性
  7. mysql 数据库文件导入和导出、远程上传和下载数据库
  8. DeepLesion 更新下载
  9. 在Ubuntu Server14.04上编译Android6.0源码
  10. 程序设计方法和程序分析
  11. Dynamips--RIP协议分析的详细过程1--前期工作准备
  12. matlab演奏《起风了》代码
  13. python seek使用_Python seek()用法及代码示例
  14. php 逻辑思维题,倘若3分钟内,你能答对这道智力题,说明你的逻辑思维能力很强...
  15. ClickHouse-物化视图
  16. Django学习之视图层
  17. w ndows7家庭版好不好用,windows7怎么样 windows7哪个版本好用【详细介绍】
  18. 苹果4s手机装 java微信_苹果4s版本过低不能下载微信怎么安装旧版本的
  19. 数据库 - About Redis
  20. ITK4.12+VS2015配置详解

热门文章

  1. Radware:2016年攻击趋势
  2. dp,px,pt,sp 的区别 以及dp 和 px 互转
  3. cropped-img_2692.jpg
  4. [Silverlight入门系列]实现局部元素全屏(Element部分全屏)
  5. First Chapter--Getting Started With Testing
  6. Web 压力测试工具 --Apache AB
  7. Oracle学习笔记:创建logical standby
  8. 关于perl中变量内插问题的讨论
  9. 安装和配置本地maven(三)
  10. Linux系统起源及主流发行版