sys_listen 函数执行监听任务,传递的两个参数分别是socket的文件号和连接数。
/*
* Perform a listen. Basically, we allow the protocol to do anything
* necessary for a listen, and if that works, we mark the socket as
* ready for listening.
*/
asmlinkage long sys_listen(int fd, int backlog)
{
struct socket *sock;
int err, fput_needed;
int somaxconn;
sock = sockfd_lookup_light(fd, &err, &fput_needed);
if (sock) {
somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
if ((unsigned)backlog > somaxconn)
backlog = somaxconn;
err = security_socket_listen(sock, backlog);
if (!err)
err = sock->ops->listen(sock, backlog);
fput_light(sock->file, fput_needed);
}
return err;
}
sys_listen() 函数找到服务器socket 以后,通过它的协议操作表结构struct proto_ops 执行其listen()
钩子函数。 proto_ops协议操作表结构的挂入过程在前面介绍了,我们也看到服务器的sock->ops挂入
的是inet_stream_ops操作表结构,因此这里调用的是inet_stream_ops 结构的listen(), 注意参数
backlog 是限定的连接数10.