epoll实现并发服务器代码
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <stdlib.h>
#include<string.h>
int main(int argc, char const *argv[])
{
int fd1,fd2;
int ret,i;
struct epoll_event event;
struct epoll_event events[10];//存放发生事件的描述符的表
char buf[128]={0};
fd1=open("/dev/input/mouse0",O_RDWR);
if(fd1<0)
{
printf("鼠标设备文件打开失败\n");
exit(-1);
}
fd2=open("/dev/mycdev0",O_RDWR);
if(fd2<0)
{
printf("设备文件打开失败\n");
exit(-1);
}
//创建一个新的epoll
int epfd=epoll_create(1);
if(epfd<0)
{
printf("epoll_create err\n");
exit(-1);
}
//将要监听的事件文件描述符添加到epoll中
event.events=EPOLLIN;
event.data.fd=fd1;
ret=epoll_ctl(epfd, EPOLL_CTL_ADD,fd1,&event);
if(ret)
{
printf("epoll_ctl err\n");
exit(-1);
}
event.events=EPOLLIN;
event.data.fd=fd2;
ret=epoll_ctl(epfd, EPOLL_CTL_ADD,fd2,&event);
if(ret)
{
printf("epoll_ctl err\n");
exit(-1);
}
//循环监听
while(1)
{
ret=epoll_wait(epfd,events,10,-1);
if(ret<0)
{
printf("epoll_wait err\n");
exit(-1);
}
for(i=0;i<ret;i++)
{
if(events[i].events&EPOLLIN)//读事件
{
read(events[i].data.fd,buf,sizeof(buf));
printf("buf:%s\n",buf);
}
}
}
//使用后关闭文件描述符
close(fd1);
close(fd2);
return 0;
}