Edge trigger and level trigger of epoll
水平触发
- 对于读操作:只要缓冲内容不为空,LT模式返回读就绪。
- 对于写操作:只要缓冲区还不满,LT模式会返回写就绪。
#include <unistd.h>
#include <stdio.h>
#include <sys/epoll.h>
int main()
{
int epfd, nfds;
char buf[256];
struct epoll_event event, events[5];
epfd = epoll_create(1);
event.data.fd = STDIN_FILENO;
event.events = EPOLLIN; // LT是默认模式
epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event);
while (1) {
nfds = epoll_wait(epfd, events, 5, -1);
int i;
for (i = 0; i < nfds; ++i) {
if (events[i].data.fd == STDIN_FILENO) {
read(STDIN_FILENO, buf, 1);
printf("hello world\n");
}
}
}
}
结果:
# ./a.out
a
hello world
hello world
ab
hello world
hello world
hello world
abc
hello world
hello world
hello world
hello world
边缘触发
-
对于读操作
(1)当缓冲区由不可读变为可读的时候,即缓冲区由空变为不空的时候。
(2)当有新数据到达时,即缓冲区中的待读数据变多的时候。
(3)当缓冲区有数据可读,且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLIN事件时。 -
对于写操作
(1)当缓冲区由不可写变为可写时。
(2)当有旧数据被发送走,即缓冲区中的内容变少的时候。
(3)当缓冲区有空间可写,且应用进程对相应的描述符进行EPOLL_CTL_MOD 修改EPOLLOUT事件时。
#include <unistd.h>
#include <stdio.h>
#include <sys/epoll.h>
int main()
{
int epfd, nfds;
struct epoll_event event, events[5];
char buf[256];
epfd = epoll_create(1);
event.data.fd = STDIN_FILENO;
event.events = EPOLLIN | EPOLLET;
epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event);
while (1) {
nfds = epoll_wait(epfd, events, 5, -1);
int i;
for (i = 0; i < nfds; ++i) {
if (events[i].data.fd == STDIN_FILENO) {
read(STDIN_FILENO, buf, 1);
printf("hello world\n");
}
}
}
}
结果:
# ./a.out
a
hello world
ab
hello world
abc
hello world