Epoll
1.为什么使用Epoll?
- 阻塞型IO与多路复用
- 阻塞型IO
- 多路复用
该进程对4个文件进行监控,判断4个文件是否可读,这个过程为多路复用。
- 阻塞型IO
- select 与epoll的区别
1.select对监控的文件是有上限的,而epoll对监控的文件没有上限
2.当某个文件发生变话的时候,select 需要遍历的发现哪个文件造成了退出,这样子显得比较低效尤其是在数据量较大时。而epool立刻知道哪个文件发生变化,不需要遍历,省去了低效的环节。
epoll是linux 里面最优秀的多路复用机制(比如网络端 摄像头等同时做多路的监控所以采用epoll架构)
2.怎么使用Epoll
1.使用 epoll_create/epoll_create1 创建epoll监听池。
2.使用epoll_ctl 添加要监听的事件 。 成功返回0 失败返回错误码。
3.使用epoll_wait 等待事件的发生,也就是监听该事件。
3.利用epoll机制监听两个FIFO(管道)
epoll.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/epoll.h>
int main()
{
int fd1,fd2;
int efd;
struct epoll_event event;
struct epoll_event *events;
char c;
//创建fifo
mkfifo("/tmp/fifo1",0666);
mkfifo("/tmp/fifo2",0666);
fd1 = open("/tmp/fifo1",O_RDONLY);
fd2 = open("/tmp/fifo2",O_RDONLY);
//创建监听池
efd = epoll_create1(0);
//构造监听事件,加入监听池
event.events = EPOLLIN|EPOLLET;
event.data.fd = fd1;
epoll_ctl(efd,EPOLL_CTL_ADD,fd1,&event);
event.events = EPOLLIN|EPOLLET;
event.data.fd = fd2;
epoll_ctl(efd,EPOLL_CTL_ADD,fd2,&event);
int n = 0;
events = calloc(100,sizeof(event));
n = epoll_wait(efd,events,100,-1);
int i = 0;
for(i = 0;i<n;i++)
{
if(events[i].events&EPOLLIN)
{
read(events[i].data.fd,&c,1);
printf("file %d can be read\n",events[i].data.fd);
}
if(events[i].events&EPOLLOUT)
{
//处理
}
if(events[i].events&EPOLLERR)
{
//处理
}
}
free(events);
close(fd1);
close(fd2);
}
ew.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main()
{
int fd;
char c = 'c';
fd = open("/tmp/fifo1",O_WRONLY);
write(fd,&c,1);
close(fd);
return 0;
}

该进程对4个文件进行监控,判断4个文件是否可读,这个过程为多路复用。
浙公网安备 33010602011771号