首页 Linux_poll函数深入理解

Linux_poll函数深入理解

举报
开通vip

Linux_poll函数深入理解Linux_poll函数深入理解   其实,poll函数与select函数差不多,下面就一起来详细了解一下poll函数吧!更多消息请关注网!   函数原型:   #include   int poll(struct pollfd fd[], nfds_t nfds, int timeout);   struct pollfd的结构如下:   struct pollfd{   int fd; // 文件描述符   short event;// 请求的事件   short revent;// 返回的事件   }   每...

Linux_poll函数深入理解
Linux_poll函数深入理解   其实,poll函数与select函数差不多,下面就一起来详细了解一下poll函数吧!更多消息请关注网!   函数原型:   #include   int poll(struct pollfd fd[], nfds_t nfds, int timeout);   struct pollfd的结构如下:   struct pollfd{   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:   代码与上一篇文章中" 利用select实现IO多路复用TCP服务端 "中代码差不多   #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)   {   struct pollfd fds[IN_FILES];   char buf[MAX_BUFFER_SIZE];   int i,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 ");   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] = '';   printf("%s", buf);   }   }   }   }   }   exit(0);   }
本文档为【Linux_poll函数深入理解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_751406
暂无简介~
格式:doc
大小:7KB
软件:Word
页数:0
分类:互联网
上传时间:2017-03-15
浏览量:15