系統呼叫listen的實現
阿新 • • 發佈:2018-12-22
linux版本:4.9.51
在APP中,
listen(listenfd, BACKLOG_SIZE);
//The backlog argument defines the maximum length to which the queue of pending connections for sockfd may grow.
SYSCALL_DEFINE2(listen, int, fd, int, backlog)
SYSCALL_DEFINE2(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 int)backlog > somaxconn) backlog = somaxconn; err = security_socket_listen(sock, backlog); // sock->ops = inet_stream_ops // inet_listen if (!err) err = sock->ops->listen(sock, backlog); fput_light(sock->file, fput_needed); } return err; }
其中 somaxconn = 128(預設值),在sysctl_core_net_init設定,呼叫路徑是:
[ 0.084553] [sysctl_core_net_init 435]net->core.sysctl_somaxconn: 128 . [ 0.084579] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.9.51-1.2 #155 [ 0.084590] Hardware name: Broadcom STB (Flattened Device Tree) [ 0.084627] [<c0210710>] (unwind_backtrace) from [<c020bb54>] (show_stack+0x10/0x14) [ 0.084652] [<c020bb54>] (show_stack) from [<c04fc69c>] (dump_stack+0x84/0x98) [ 0.084677] [<c04fc69c>] (dump_stack) from [<c0e29e70>] (sysctl_core_net_init+0x30/0x5c) [ 0.084701] [<c0e29e70>] (sysctl_core_net_init) from [<c07f5ed4>] (ops_init.constprop.5+0xa4/0x110) [ 0.084723] [<c07f5ed4>] (ops_init.constprop.5) from [<c07f5fec>] (register_pernet_operations+0xac/0xdc) [ 0.084743] [<c07f5fec>] (register_pernet_operations) from [<c07f6048>] (register_pernet_subsys+0x2c/0x40) [ 0.084763] [<c07f6048>] (register_pernet_subsys) from [<c0201898>] (do_one_initcall+0x54/0x190) [ 0.084786] [<c0201898>] (do_one_initcall) from [<c0e00e74>] (kernel_init_freeable+0x158/0x1e4) [ 0.084810] [<c0e00e74>] (kernel_init_freeable) from [<c09b69bc>] (kernel_init+0x8/0x114) [ 0.084832] [<c09b69bc>] (kernel_init) from [<c0208628>] (ret_from_fork+0x14/0x2c)