epoll 是Linux 2.6内核提出的 ,可以理解其为select和poll的增强版
优点:
支持一个进程打开大数目的socket描述符(FD)
IO效率不随FD数目增加而线性下降
epoll还维护了一个双链表,用户存储发生的事件
一颗红黑树,一张准备就绪句柄链表,少量的内核cache,就帮我们解决了大并发下的socket处理问题
实现epoll逻辑
1、创建epoll实例:epoll_create()
2、修改epoll的兴趣列表:epoll_ctl()
3、事件等待:epoll_wait()
实例
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#define MAX_LISTEN_QUE 13
#define MAXEVENTSIZE 512
#define BUFF "hello client , i'm server!"
//初始化并返回套接字函数,socket、bind、listen
int socket_init(void)
{
int ser_fd = -1;
int rv = -1;
int on = 1;
int port = 9998;
struct sockaddr_in ser_addr;
ser_fd = socket(AF_INET, SOCK_STREAM, 0);
if(ser_fd < 0)
{
printf("create socket failure:%s\n", strerror(errno));
return -1;
}
printf("\ncreate socket[%d]successfully!\n",ser_fd);
if((rv = setsockopt(ser_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on))) < 0)
{
printf("\n设置地址重用失败:%s\n"

本文详细介绍了Linux内核中的epoll机制,作为select和poll的增强版,epoll在处理大量socket描述符时具有更高的效率。文章通过创建epoll实例、修改兴趣列表和等待事件三个步骤,展示了epoll的工作流程,并提供了一个服务器端的示例代码,演示了如何使用epoll监听和响应客户端连接及读写操作。
最低0.47元/天 解锁文章
1010

被折叠的 条评论
为什么被折叠?



