深入理解epoll

本文详细介绍了epoll在Linux中的工作原理,包括accept创建新socket的过程,epoll_create的实现,epoll_ctl如何添加socket到管理中,以及epoll_wait的等待接收机制。通过epoll,系统能够高效地管理大量并发连接,适用于高性能服务器场景。

 记录一下腾讯技术工程公众号上看到的一篇文章~

int main(){
    listen(lfd, ...);

    cfd1 = accept(...);
    cfd2 = accept(...);
    efd = epoll_create(...);

    epoll_ctl(efd, EPOLL_CTL_ADD, cfd1, ...);
    epoll_ctl(efd, EPOLL_CTL_ADD, cfd2, ...);
    epoll_wait(efd, ...)
}

和epoll相关的函数主要有三个:

  • epoll_create:创建一个 epoll 对象

  • epoll_ctl:向 epoll 对象中添加要管理的连接

  • epoll_wait:等待其管理的连接上的 IO 事件

一、accept创建新的socket

        accept之后会创建一个新的socket专门用于和对应的客户端通信,然后把这个socket放到当前晋城的打开文件列表里,毕竟linux就是一切皆文件~,在net/socket.c文件下有accpet的系统调用代码。

每个socket在内核中以struct socket结构体现这一部分的文件。应用系统的函数调用如socket、bind、listen、accept、connect 等函数,将通过共同的入口函数 sys_socket 调用BSD socket层的对应系统调用函数,如sock_socket、sock_bind、sock_listen、sock_accept、sock_connect 等函数(socket.c)。从前面分析得知, sock_ 函数内部又将调用下一层的函数实现((2条消息) tcpip四层源码分析(Linux)_一毛颠的博客-优快云博客

//file: net/socket.c
SYSCALL_DEFINE4(accept4, int, fd, struct sockaddr __user *, upeer_sockaddr,
        int __user *, upeer_addrlen, int, flags)
{
    struct socket *sock, *newsock;

    //根据 fd 查找到监听的 socket
    sock = sockfd_lookup_light(fd, &err, &fput_needed);

    //1.1 申请并初始化新的 socket
    newsock = sock_alloc();//申请一个 struct socket 对象出来
    newsock-&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值