Linux epoll两种触发模式——LT/ET
epoll 两种触发模式epoll有两种触发模式,分别为LT水平触发,ET边沿触发。event.events = EPOLLIN | EPOLLET;//ET 边沿触发模式event.events = EPOLLIN;//默认 LT触发模式epoll的两种触发模式会在epoll_wait()函数处对读取缓冲区有不用的处理方式。1.LT水平触发(默认):当缓存区...
epoll 两种触发模式
epoll有两种触发模式,分别为LT水平触发,ET边沿触发。
event.events = EPOLLIN | EPOLLET;//ET 边沿触发模式
event.events = EPOLLIN; //默认 LT触发模式
epoll的两种触发模式会在epoll_wait()函数处对读取缓冲区有不用的处理方式。
1.LT水平触发(默认):当缓存区的数据没有被一次性读取完,那么epoll_wait()函数会非阻塞的进行再次读取,直至读写缓存区的数据被读取完成。
2.ET边沿触发:每当进行一次读取操作后,epoll_wait()函数就会堵塞,直至下一次缓存区数据的写入,才会在此的触发读取操作。
区别:对于LT模式,保证了对数据的完整性读取,但是对一些不重要的不必要的数据来说,会加大内核对epoll_wait()函数的调用,加大开销。对于ET模式,可以在程序中设定读取的关键信息段,从而来减轻内核的开销,效率而言相比LT来说较高。但是值得注意的是读取缓存区需要及时将多余的信息清理掉,保证下一次读取的可靠性。
两种触发模式简单示例:
1.LT水平触发:每次读取的数据为写入的一半。
#include<ctype.h>
#include<unistd.h>
#include<stdio.h>
#include<strings.h>
#include<sys/wait.h>
#include<sys/epoll.h>
#include<time.h>
#define MAXSIZELINE 10
int main(void)
{
int pfd[2];//创建管道准备
int efd,i;
pid_t pid;
char buf[MAXSIZELINE];
char ch = '1';
pipe(pfd);//创建管道
pid = fork();
if(pid == 0)//子进程 写
{
close(pfd[0]);//关闭 读
while(1)
{
for(i = 0; i < MAXSIZELINE / 2;i++)
buf[i] = ch;
ch++;
for(i; i < MAXSIZELINE;i++)
buf[i] = ch;
ch++;
write(pfd[1],buf,MAXSIZELINE);//
sleep(3);//每次休眠3秒再次写入
printf("write again!\n");
}
close(pfd[1]);
}
else if(pid > 0)//父进程 读
{
close(pfd[1]);
struct epoll_event event;
struct epoll_event resevent[MAXSIZELINE];
int res , len;
efd = epoll_create(MAXSIZELINE);
//event.events = EPOLLIN | EPOLLET;//ET 边沿触发模式
event.events = EPOLLIN; //默认 LT触发模式
event.data.fd = pfd[0];
epoll_ctl(efd,EPOLL_CTL_ADD,pfd[0],&event);
printf("epoll_wait begin \n");
while(1)
{
printf("epoll_wait again \n");
res = epoll_wait(efd,resevent,MAXSIZELINE,-1);
printf("res = %d",res);
printf("\n");
if(resevent[0].data.fd == pfd[0])
{
len = read(pfd[0],buf,MAXSIZELINE/2);//测试触发模式,只读一半的数据,留一半在缓冲区内
write(STDOUT_FILENO,buf,len);
}
}
}
}
两种模式分别的运行结果
1.LT模式:
每次写入10个字符,1111122222,按照LT模式触发,分为两次读取,epoll_wait()在第二次读取时没有发生阻塞,读取余下部分的数据。
2.ET模式
每次同样写入10个字符,1111122222,按照ET模式触发,分为两次读取epoll_wait()在第二次读取时发生了阻塞,当等到write 再次写入的时候,依次读取余下部分的数据。
更多推荐
所有评论(0)