您的位置:首页 > 运维架构 > Linux

linux下的poll机制

2015-11-14 17:09 771 查看
poll函数用于监测多个等待事件,若事件未发生,进程睡眠,放弃CPU控制权,若监测的任何一个事件发生,poll将唤醒睡眠的进程,并判断是什么等待事件发生,执行相应的操作。poll函数退出后,struct pollfd变量的所有值被清零,需要重新设置。

poll((struct pollfd *)&event, 1, 5000); //第一个参数为事件,第二个参数为监测的对象数量,第三个参数为等待的时间,超过该值为超时。这里表示监测event,一个对象,等待5000ms后超时,该值设置为-1表示无限等待。

poll函数返回值:负数为出错,0为超时,整数表示等待的时间内发生。贴一个测试代码:poll函数解释与代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*文件控制*/
#include <sys/select.h>
#include <sys/time.h> /*时间方面的函数*/
#include <errno.h> /*有关错误方面的宏*/
#include<sys/poll.h> //poll()
#include<fcntl.h>
#include<string.h> //memset()

int main(void)
{
int fd,key_value,ret;
struct pollfd event; //创建一个struct pollfd结构体变量,存放文件描述符、要等待发生的事件
fd=open("/dev/key",O_RDWR);
if(fd<0){
perror("open /dev/key error!\n");
exit(1);
}
printf("open /dev/key sucessfully!\n");
while(1){ //poll结束后struct pollfd结构体变量的内容被全部清零,需要再次设置
memset(&event,0,sizeof(event)); //memst函数对对象的内容设置为同一值
event.fd=fd; //存放打开的文件描述符
event.events=POLLIN; //存放要等待发生的事件
ret=poll((struct pollfd *)&event,1,5000); //监测event,一个对象,等待5000毫秒后超时,-1为无限等待

//判断poll的返回值,负数是出错,0是设定的时间超时,整数表示等待的时间发生
if(ret<0){
printf("poll error!\n");
exit(1);
}
if(ret==0){
printf("Time out!\n");
continue;
}
if(event.revents&POLLERR){ //revents是由内核记录的实际发生的事件,events是进程等待的事件
printf("Device error!\n");
exit(1);
}
if(event.revents&POLLIN){
read(fd,&key_value,sizeof(key_value));
printf("Key value is '%d'\n",key_value);
}
}
close(fd);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: