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. asp.net获取网站路径
  2. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个...
  3. 操作系统(十四)进程调度的时机、调度方式
  4. Objecttive-C 创建多线程
  5. Centos安装后的一些必要处理工作
  6. 对象必须实现 iconvertible。_java面向对象最全入门笔记(通俗易懂,适合初学者)...
  7. K-近邻算法(KNN)概述
  8. html中style布局放哪,CSS样式表与格式布局详解
  9. Java之一致性hash算法原理及实现
  10. php mysql sqlite3_PHP连接SQLite数据库
  11. 机器学习分类问题中_训练数据类别不均衡怎么解决
  12. 注意细节:Javascript中的变量作用域
  13. linux下二进制包、源代码包、rpm包
  14. 可视化:小型有向网络HTML自动生成器
  15. 跑分软件测试的游戏是,扔掉跑分软件 开启游戏测评2.0时代
  16. python爬虫批量下载图片
  17. 蚁群算法解决tsp问题python_蚁群算法在解决TSP问题中的应用
  18. 【全网最全面】SourceTree使用教程详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决,提交PR)...
  19. 基于Matlab的脉冲多普勒雷达仿真
  20. 甲方安全开源项目收集

热门文章

  1. 攻防世界MISC新手区 give_you_flag
  2. Ubuntu 16.04 LTS版本部署Virtualmin
  3. 在线教育实现高效益游戏化运营
  4. java里localtime,java 时间转换之LocalDate,LocalTime ,LocalDateTime
  5. css3实现 slideUp/slideDown效果
  6. SpringCloud链路追踪SkyWalking-第四章-自定义链路追踪
  7. 麻将高效鬼牌胡牌算法(C++版)
  8. (二)使用Navicat将mssql数据库数据迁移到PostgreSql
  9. 【机器学习】<刘建平Pinard老师博客学习记录>机器学习算法的随机数据生成
  10. 恭喜!密码学家王小云获未来科学大奖,百万美元奖金