poll()函数详解
poll提供的功能与select类似,不过在处理流设备时,它能够提供额外的信息。
#include <poll.h>
int poll(struct pollfd fd[], nfds_t nfds, int timeout);
参数:
1)第一个参数:一个结构数组,struct pollfd结构如下:
struct pollfd{
int fd; //文件描述符
short events; //请求的事件
short revents; //返回的事件
};
events和revents是通过对代表各种事件的标志进行逻辑或运算构建而成的。events包括要监视的事件,poll用已经发生的事件填充revents。poll函数通过在revents中设置标志肌肤POLLHUP、POLLERR和POLLNVAL来反映相关条件的存在。不需要在events中对于这些标志符相关的比特位进行设置。如果fd小于0, 则events字段被忽略,而revents被置为0.标准中没有说明如何处理文件结束。文件结束可以通过revents的标识符POLLHUN或返回0字节的常规读操作来传达。即使POLLIN或POLLRDNORM指出还有数据要读,POLLHUP也可能会被设置。因此,应该在错误检验之前处理正常的读操作。
poll函数的事件标志符值
常量 | 说明 |
POLLIN | 普通或优先级带数据可读 |
POLLRDNORM | 普通数据可读 |
POLLRDBAND | 优先级带数据可读 |
POLLPRI | 高优先级数据可读 |
POLLOUT | 普通数据可写 |
POLLWRNORM | 普通数据可写 |
POLLWRBAND | 优先级带数据可写 |
POLLERR | 发生错误 |
POLLHUP | 发生挂起 |
POLLNVAL | 描述字不是一个打开的文件 |
注意:后三个只能作为描述字的返回结果存储在revents中,而不能作为测试条件用于events中。
2)第二个参数nfds:要监视的描述符的数目。
3)最后一个参数timeout:是一个用毫秒表示的时间,是指定poll在返回前没有接收事件时应该等待的时间。如果 它的值为-1,poll就永远都不会超时。如果整数值为32个比特,那么最大的超时周期大约是30分钟。
timeout值 | 说明 |
INFTIM | 永远等待 |
0 | 立即返回,不阻塞进程 |
>0 | 等待指定数目的毫秒数 |
例子程序:
在/root/pro/fd1 /root/pro/fd2中分别有内容,
1234
5678
和
1122
3344
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <stropts.h>
#include <sys/poll.h>
#include <sys/stropts.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <poll.h>
#define BUFSIZE 1024
int main(int argc, char *argv[])
{
char buf[BUFSIZE];
int bytes;
struct pollfd *pollfd;
int i=0;
int nummonitor=0;
int numready;
int errno;
char *str;
if(argc != 3)
{
fprintf(stderr,"Usage:the argc num error\n");
exit(1);
}
if((pollfd = (struct pollfd*)calloc(2, sizeof(struct pollfd))) == NULL) //为struct pollfd分配空间
exit(1);
for(i; i<2; i++) //初始化化struct pollfd结构
{
str = (char*)malloc(14*sizeof(char));
memcpy(str,"/root/pro/",14);
strcat(str,argv[i+1]);//注意,需要把路劲信息放到str中,否则opne("/root/pro/argv[i]",O_RDONLY)会出错
printf("str=%s\n",str);//原因在于,在” “之中的argv[i]是字符串,不会用变量代替argv[i].
(pollfd+i)->fd = open(str,O_RDONLY);
if((pollfd+i)->fd >= 0)
fprintf(stderr, "open (pollfd+%d)->fd:%s\n", i, argv[i+1]);
nummonitor++;
(pollfd+i)->events = POLLIN;
}
printf("nummonitor=%d\n",nummonitor);
while(nummonitor > 0)
{
numready = poll(pollfd, 2, -1);
if ((numready == -1) && (errno == EINTR))
continue; //被信号中断,继续等待
else if (numready == -1)
break; //poll真正错误,推出
printf("numready=%d\n",numready);
for (i=0;nummonitor>0 && numready>0; i++)
{
if((pollfd+i)->revents & POLLIN)
{
bytes = read(pollfd[i].fd, buf, BUFSIZE);
numready--;
printf("pollfd[%d]->fd read buf:\n%s \n", i, buf);
nummonitor--;
}
}
}
for(i=0; i<nummonitor; i++)
close(pollfd[i].fd);
free(pollfd);
return 0;
}
输出结果:
poll()函数详解相关推荐
- 【C/C++服务器开发】文件,文件描述符,I/O多路复用,select / poll / epoll 详解
文章目录 一.前言 1.文件的概念 2.文件描述符和文件指针 文件描述符 文件描述符和文件指针的区别 文件描述符太多了怎么办 二.I/O多路复用 1.I/O多路复用的由来 不要打电话给我,有需要我会打 ...
- unix环境高级编程之 read与write 函数详解
学习记录:unix环境高级编程之 read 与write 函数详解 备注:本博文非本人所写,本人觉得此文讲的非常地道通俗易懂,所以摘录在此以方便以后再次查看 read函数从打开的设备或文件中读取数据 ...
- C语言网络编程:accept函数详解
文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...
- 【FFmpeg】函数详解(三)
FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...
- 【FFmpeg】函数详解(二)
FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...
- 【FFmpeg】函数详解(一)
FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...
- 【ES6】Generator函数详解
[ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...
- mysql的聚合函数综合案例_MySQL常用聚合函数详解
一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...
- python平方数迭代器_对python中的高效迭代器函数详解
python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...
- python基础知识~ 函数详解2
python~函数详解2 1 生成器函数 定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数 须知 yield和return一样,都可以返回数 ...
最新文章
- 一口气说出 9种 分布式ID生成方式,面试官有点懵了
- Aveiconifier是一个非常实用方便的制作ico格式文件的小工具~
- oracle bi publisher 安装,Oracle BI Publisher 企业版安装后的配置(BI Publisher Enterprise Edition)...
- Test_data detection-Illumination
- android layoutparams,Android LayoutParams用法解析
- 关于产品经理如何准备面试,我有三点想法
- (转)Java线程:新特征-线程池
- nginx 实现负载均衡
- 马化腾很忙:阐释腾讯新定位、与长安合资建车公司,还出了本新书
- BT种子文件(.torrent)的具体文件结构
- Windows下 OpenCV 的下载安装教程(详细)
- 如何用后视镜判断车距
- [SugerTangYL] 时钟管理(分频器、倍频器、锁相环)Verilog
- 领英中国总裁陆坚:顺应本土化发展,领英进入3.0阶段 。我们该如何正确使用领英
- Win10 上切换至Administrator用户
- 分布式环境下对部分热数据(如redis热key,热请求)进行探测,并对探测结果及时同步到各个client实例的JVM内存的方案简述
- abaqus帮助html,ABAQUS/CAE 常 问 界 面 操 作(转自SimWe仿真论坛
- 【微信小程序】一文带你吃透小程序开发框架——视图层中的事件系统
- Trinity介绍与使用(一)
- 极简linux版本,4MLinux 26.0发布,这是一个极简版本
热门文章
- 木马入侵查杀 linux
- 06-机器学习.数据分析.数据挖掘的区别于联系
- django 多对多表的创建,级联删除,手动创建第三张表
- HDU 3081 Marriage Match II【并查集+二分图最大匹配】
- (转)[EntLib]微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART2——了解Unity的使用方法(1)...
- (求助)即时发送异常给开发人员
- linux7 ntp log,RH254小结(九)rhel7新的ntp对时服务Chrony
- Java+MyEclipse+Tomcat (五)DAO和Java Bean实现数据库和界面分开操作
- 【数据结构与算法】之深入解析“序列化和反序列化二叉搜索树”的求解思路与算法示例
- LeetCode Algorithm 746. 使用最小花费爬楼梯