基本介紹
- 外文名:poll
- 作用:把當前的檔案指針掛到等待佇列
- 實現功能:和select功能差不多
- 操作舉例:#include <stdio.h>
函式
poll實現功能
常量 | 說明 |
POLLIN | 普通或優先權帶數據可讀 |
POLLRDNORM | 普通數據可讀 |
POLLRDBAND | 優先權帶數據可讀 |
POLLPRI | 高優先權數據可讀 |
POLLOUT | 普通數據可寫 |
POLLWRNORM | 普通數據可寫 |
POLLWRBAND | 優先權帶數據可寫 |
POLLERR | 發生錯誤 |
POLLHUP | 發生掛起 |
POLLNVAL | 描述字不是一個打開的檔案 |
poll操作舉例
#include <stdio.h>
#include <stdlib.h>#include <string.h>#include <time.h>#include <errno.h>#include <poll.h>#include <fcntl.h>#include <unistd.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);}
