【C语言】Linux 内核listen系统调用代码

一、Linux 4.19内核listen系统调用代码注释

/**  开始对一个 socket 进行监听。这个函数做一些准备工作以便 socket 可以开始监听,*  如果操作成功,则将 socket 标记为准备好监听的状态。*/int __sys_listen(int fd, int backlog)
{struct socket *sock;  // 定义 socket 结构指针int err, fput_needed; // 错误码变量和引用计数释放标志int somaxconn; // 用于存储系统限制的最大监听队列长度// 试图通过文件描述符 fd 查找对应的 socket 结构sock = sockfd_lookup_light(fd, &err, &fput_needed);if (sock) { // 如果找到了对应的 socket// 获取系统配置的最大监听队列长度(SOMAXCONN 的值)somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;// 如果请求的 backlog 超过了系统设置的最大值,则强制降低至系统设置的最大值if ((unsigned int)backlog > somaxconn)backlog = somaxconn;// 调用安全模块相关函数,对 socket 进行监听之前的安全检查err = security_socket_listen(sock, backlog);// 安全检查通过,然后实际通过 socket 操作来进行监听if (!err)err = sock->ops->listen(sock, backlog);// 对 sock 文件描述符的引用计数减一,如果需要的话释放它fput_light(sock->file, fput_needed);}// 返回操作的结果,如果出现错误 err 中会有错误码return err;
}// syscall 宏定义,它会将 listen 这个系统调用附加到内核中的系统调用表,使得用户程序可以通过系统调用接口使用
SYSCALL_DEFINE2(listen, int, fd, int, backlog)
{// 直接调用上面定义的 __sys_listen 函数来处理系统调用return __sys_listen(fd, backlog);
}

二、代码解释

这段代码是 Linux 内核中负责设置 socket 监听状态的 C 函数。以下是代码的解释:
首先定义了一个内核函数 __sys_listen,这个函数是设置 socket 进入监听状态的实际实现。它接受两个参数:`fd` 和 backlog。`fd` 是文件描述符,代表一个打开的 socket;`backlog` 是一个整数,它制定了 socket 可以排队的最大连接数。
函数定义中的变量解释:
- struct socket *sock;: 定义了一个 socket 结构体指针 sock,用于储存查找到的 socket 信息。
- int err, fput_needed;: err 用于存放错误代码,`fput_needed` 用于标记文件描述符引用计数的递减是否需要。
- int somaxconn;: 用于存储系统定义的最大监听队列长度。
函数执行过程分解:
1. sock = sockfd_lookup_light(fd, &err, &fput_needed);: 通过文件描述符 fd 来查找对应的 socket。如果找不到,则 sock 为 NULL,并且 err 会被设置为相应的错误码。
2. if (sock) { ... }: 如果找到了 socket,就进入大括号中执行相关操作。
3. somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;: 获取系统配置的最大监听队列长度(SOMAXCONN 值),进行接下来的队列长度限制。
4. if ((unsigned int)backlog > somaxconn) backlog = somaxconn;: 如果传入的 backlog 值大于 somaxconn,则将其限制为 somaxconn。
5. err = security_socket_listen(sock, backlog);: 调用安全模块相关函数进行监听之前的安全检查。
6. if (!err) err = sock->ops->listen(sock, backlog);: 如果安全检查没有产生错误,则调用 socket 的监听操作。如果监听操作失败,则将错误码存入 err。
7. fput_light(sock->file, fput_needed);: 对应文件描述符的引用计数进行递减,若需要则释放文件。
最后,`__sys_listen` 函数返回 err,这个返回值表示了监听操作的结果。
接下来,使用 SYSCALL_DEFINE2(listen, int, fd, int, backlog) 宏定义 syscall 接口 listen,这个接口让用户空间的程序可以调用内核中定义的 __sys_listen 函数进行 socket 监听设置。这个宏基本上是定义了一个符合 Linux syscall 调用约定的包装函数,可以被 syscall 表访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471574.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现MainActivity转到其他界面的功能实现

#安卓 实现MainActivity转到其他界面的功能实现 实现步骤: 1.添加两个界面及;layout,分别为fullsreen和dialog 2.mainifest中注册两个antivity 3.向Mainactivity中代码。用intent简单的跳转 package com.example.myapplication;import an…

【HarmonyOS】鸿蒙开发之渲染控制——第2.3章

if/eles条件渲染 if的使用方法与javascript,java中使用的if/eles条件渲染使用基本一致。 案例: Entry Component struct IfElseDemo{State isShow:boolean false;build(){Column() {TitleBar({titleBarAttribute: {title: "ifElse使用案例",backShow:…

安卓自定义画板

包含功能: 包含 获取当前画板的截图、设置画笔样式、获取画笔样式、设置画笔宽度、获取画笔宽度、设置画笔颜色、获取画笔颜色、加载图片、获取图片位图对象、设置图片位图对象,并在画布上绘制图片、撤销上一步操作、重做上一步撤销的操作、清空所有绘图…

算法刷题day13

目录 引言一、蜗牛 引言 今天时间有点紧,只搞了一道题目,不过确实搞了三个小时,才搞完,主要是也有点晚了,也好累啊,不过也还是可以的,学了状态DP,把建图和spfa算法熟悉了一下&#…

数据结构——链表 原理及C语言代码实现(可直接运行版)

1.链表 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 2.链表的分类 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构: ①单向或者双向 ②带头或者不…

C语言结构体,结构体指针,学了C语言到底有什么用?

#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> struct Stu { char name[20]; //结构体成员名称&#xff0c;数据类型 int age; char sex[10]; char tele[12]; }; void print(struct Stu* ps) //结构体指针 { printf("%s %d %s %s\n&…

2024.2.16每日一题

LeetCode 二叉树的锯齿层序遍历 103. 二叉树的锯齿形层序遍历 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类…

【C语言】简单贪吃蛇实现保姆级教学!!!

关注小庄 顿顿解馋૮(˶ᵔ ᵕ ᵔ˶)ა 新年快乐呀小伙伴 引言&#xff1a; 小伙伴们应该都有一个做游戏的梦吧&#xff1f;今天让小庄来用C语言简单实现一下我们的童年邪典贪吃蛇&#xff0c;顺便巩固我们的C语言知识&#xff0c;请安心食用~ 文章目录 贪吃蛇效果一.游戏前工作…

[嵌入式系统-16]:RT-Thread -2- 主要功能功能组件详解与API函数说明

目录 一、RT-Thread主要功能组件 二、内核组件 2.1 概述 2.2 API 三、设备驱动 3.1 概述 3.2 API 四、通信组件 4.1 概述 4.4 API 五、网络组件 5.1 概述 5.2 API 5.3 补充&#xff1a;MQTT协议 六、文件系统 6.1 概述 6.2 API 七、GUI 组件 7.1 概述 7.2 …

165基于matlab的各类滤波器

基于matlab的各类滤波器。汉宁窗设计Ⅰ型数字高通滤波器、切比雪夫一致逼近法设计FIR数字低通滤波器、模拟Butterworth滤波器设计数字低通滤波器、频域抽样法的FIR数字带阻滤波器设计、频域抽样法的FIR数字带通滤波器设计、汉宁窗的FIR数字高通滤波器设计、双线性法设计巴特沃斯…

各版本安卓的彩蛋一览

目录 前言前彩蛋纪Android 2.3 GingerbreadAndroid 3 HoneycombAndroid 4.0 Ice Cream SandwichAndroid 4.1-4.3 JellybeanAndroid 4.4 KitKatAndroid 5 LollipopAndroid 6 MarshmallowAndroid 7 NougatAndroid 8 OreoAndroid 9 PieAndroid 10 Queen CakeAndroid 11 Red Velvet…

备战蓝桥杯---图论之最短路dijkstra算法

目录 先分个类吧&#xff1a; 1.对于有向无环图&#xff0c;我们直接拓扑排序&#xff0c;和AOE网类似&#xff0c;把取max改成min即可。 2.边权全部相等&#xff0c;直接BFS即可 3.单源点最短路 从一个点出发&#xff0c;到达其他顶点的最短路长度。 Dijkstra算法&#x…