第三步,使用来等待事件的发生 。
int epoll_wait(int epfd, struct epoll_event *evlist, int maxevents, int timeout);
特别留意,这一步是"block"的 。只有当注册的事件至少有一个发生,或者达到时,该调用才会返回 。这与和poll几乎一致 。但不一样的地方是,它是的返回数组,里面只包含那些被触发的事件对应的fd,而不是像和poll那样返回所有注册的fd 。
监听fd事件
综合起来,一段比较完整的epoll代码大概是这样的 。
#define MAX_EVENTS 10
struct epoll_event ev, events[MAX_EVENTS];
int nfds, epfd, fd1, fd2;
// 假设这里有两个socket,fd1和fd2,被初始化好 。
// 设置为non blocking
setnonblocking(fd1);
setnonblocking(fd2);
// 创建epoll
epfd = epoll_create(MAX_EVENTS);
if (epollfd == -1) {
perror("epoll_create1");
exit(EXIT_FAILURE);
}
//注册事件
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = fd1;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd1, &ev) == -1) {
perror("epoll_ctl: error register fd1");
exit(EXIT_FAILURE);
}
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, fd2, &ev) == -1) {
perror("epoll_ctl: error register fd2");
exit(EXIT_FAILURE);
}
// 监听事件
for (;;) {
nfds = epoll_wait(epdf, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_wait");
exit(EXIT_FAILURE);
}
for (n = 0; n
- 个人信息安全影响评估 范围
- java的组件和事件处理 JAVA实现简单的文本文件
- 什么是DFT?FT、FS、DTFT、DFS、DFT的关系
- TTY设备驱动结构
- 上 编写Linux网络设备驱动
- 个人总结 Flume基础知识
- MacOS 安装Hadoop3.1.1教程
- 直方图中最大矩形面积
- 李白中了汪伦的计却跟汪伦更好了?
- 如不才可自取:刘备托孤真有心让位诸葛亮吗?