必威体育Betway必威体育官网
当前位置:首页 > IT技术

poll()函数详解

时间:2019-11-05 02:43:23来源:IT技术作者:seo实验室小编阅读:61次「手机版」
 

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;

}

输出结果:

文章最后发布于: 2017-12-26 20:32:15

相关阅读

我读过的最好的epoll讲解--转自”知乎“

首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。不管是文件,还是套接字,还是管道,我们都可以把

李彦宏阔步前行:百度Apollo诠释无人驾驶技术发展新速度

互联网巨头们都有很明显的标签化属性,阿里的电子商务、腾讯的网络社交,而搜索引擎则是公众对于百度的一贯认知。进入移动互联网赛道

linux 高并发事件触发处理 — epoll

一. 概述 epoll 是 Linux 内核为处理大批量文件描述符而作了改进的 poll,是 Linux 下多路复用 IO接口 select/poll 的增强版本

(3.2)一个按键所能涉及的:poll机制

/* AUTHOR: Pinus * Creat on : 2018-10-11 * KERNEL : linux-4.4.145 * BOARD : JZ2440(arm9 s3c2440) * REFS : 韦东山视频教程

分享到:

栏目导航

推荐阅读

热门阅读