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 再次写入的时候,依次读取余下部分的数据。
在这里插入图片描述

Logo

更多推荐