poll function


poll

目錄

函數
poll實現功能
poll操作舉例

函數

  Linux中的字符設備驅動中有一個函數   

unsigned int (*poll)(struct file * fp, struct poll_table_struct * table)  

 此函數在系統調用select內部被使用,作用是把當前的文件指針掛到設備內部定義的等待隊列中。這里的參數table可以不考慮,是在select函數實現過程中的一個內部變量。

  函數具體實現時:  

 wait_queue_head_t t = ((struct mydev *)filp->private_data)->wait_queue;  

 poll_wait(filp, t, table);  

 return mask;  

 這里mask可以是:   POLLIN | POLLRDNORM   POLLOUT | POLLWRNORM   等等。  

 poll()函數:這個函數是某些Unix系統提供的用於執行與select()函數同等功能的函數,下面是這個函數的聲明:  

 #include <poll.h>  

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

 參數說明:   fds:是一個struct pollfd結構類型的數組, 用於存放需要檢測其狀態的Socket描述符;每當調用這個函數之后,系統不會清空這個數組,操作起來比較方便;特別是對於socket連接比較多的情況 下,在一定程度上可以提高處理的效率;這一點與select()函數不同,調用select()函數之后,select()函數會清空它所檢測的 socket描述符集合,導致每次調用select()之前都必須把socket描述符重新加入到待檢測的集合中;因此,select()函數適合於只檢 測一個socket描述符的情況,而poll()函數適合於大量socket描述符的情況;   nfds:nfds_t類型的參數,用於標記數組fds中的結構體元素的總數量;   timeout:是poll函數調用阻塞的時間,單位:毫秒;   返回值:   >0:數組fds中准備好讀、寫或出錯狀態的那些socket描述符的總數量;   ==0:數組fds中沒有任何socket描述符准備好讀、寫,或出錯;此時poll超時,超 時時間是timeout毫秒;換句話說,如果所檢測的socket描述符上沒有任何事件發生的話,那么poll()函數會阻塞timeout所指定的毫秒 時間長度之后返回,如果timeout==0,那么poll() 函數立即返回而不阻塞,如果timeout==INFTIM,那么poll() 函數會一直阻塞下去,直到所檢測的socket描述符上的感興趣的事件發生是才返回,如果感興趣的事件永遠不發生,那么poll()就會永遠阻塞下去;   -1: poll函數調用失敗,同時會自動設置全局變量errno;

編輯本段poll實現功能

  poll和select實現功能差不多,但poll效率高,以后要多用poll

  poll()接受一個指向結構'struct pollfd'列表的指針,其中包括了你想測試的文件描述符和 事件。事件由一個在結構中事件域的比特掩碼確定。當前的結構在調用后將被填寫並在事件發生后返回。在SVR4(可能更早的一些版本)中的 "poll.h"文件中包含了用於確定事件的一些宏定義。事件的等待時間精確到毫秒 (但令人困惑的是等待時間的類型卻是int),當等待時間為0時,poll()函數立即返回,-1則使poll()一直掛起直到一個指定事件發生。下面是 pollfd的結構。  

 struct pollfd {   int fd; /* 文件描述符 */   short events; /* 等待的事件 */   short revents; /* 實際發生了的事件 */   };  

 於select()十分相似,當返回正值時,代表滿足響應事件的文件描述符的個數,如果返回0則代表在規定事件內沒有事件發生。如發現返回為負則應該立即查看 errno,因為這代表有錯誤發生。  

 如果沒有事件發生,revents會被清空,所以你不必多此一舉。

poll操作舉例

  #include <fcntl.h>   

#include <stdio.h>

  #include <unistd.h>  

 #include <stdlib.h>  

 #include <string.h>  

 #include <time.h>   

#include <errno.h>  

 #include <poll.h>   

#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;   }  

 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);  

 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM