记录一下腾讯技术工程公众号上看到的一篇文章~
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)_一毛颠的博客-CSDN博客)
//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, &