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
#include
#include
#include
#include
#include
#include
#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 |