1、函数原型:
int poll(struct pollfd fds[], nfds_t nfds, int timeout);
2、函数的作用:
和select函数基本相同,为了提高程序的运行效率,把阻塞原来阻塞的函数编程非阻塞。并可以设置如果超过时间未发生事件,则直接返回。
3、参数:
(1)fds,一个数组名,数组成员里面存的类型为struct pollfd
struct pollfd {
int fd; //事件的文件描述符
short events; //设定要发生的事件
short revents;//函数返回的
};
(2)第二个参数,nfds,第一个参数数组的个数
(3)第三个参数,timeout,单位是ms,超过timeou设定的时间,则自动返回0
4、返回值
(1)超过时间则返回0
(2)错误返回-1,并且置error
(3)在时间发生则返回一个大于零的值,结构体struct pollfd 中的revents,也会被置标志位,用来和events进行比较,判断当前事件是否发生。
5、示例
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/select.h>
#include <poll.h>
int main(void)
{
int fd = -1;
char buf[100] = {0};
int ret = 0;
struct pollfd myfds[2]={0};
fd = open("/dev/input/mouse0",O_RDONLY); //打开鼠标文件
if(fd < 0)
{
perror("open:");
}
myfds[0].fd = fd;
myfds[1].fd = 0;
myfds[0].events = POLLIN;
myfds[1].events = POLLIN;
ret = poll(myfds,2,2000);
if(ret == 0)
{
printf("超时了\n");
}
else if(ret == -1)
{
perror("poll:");
}
else
{
if(myfds[0].events == myfds[0].revents)
{
memset(buf,0,sizeof(buf));
read(fd,buf,10);
printf("鼠标读到的内容是:%s\n",buf);
}
if(myfds[1].events == myfds[1].revents)
{
memset(buf,0,sizeof(buf));
read(0,buf,10);
printf("键盘读到的内容是:%s\n",buf);
}
}
return 0;
}