【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.mzph.cn/news/684716.shtml

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

相关文章

VueCLI核心知识4:动画效果、过渡效果

1 动画效果 【代码】 <template><div><button click"isShow !isShow">显示/隐藏</button><!-- <transition name"xxx" :appear"true"> 可以指定name属性&#xff0c;也可以不指定&#xff0c;name属性在有…

Codeforces Round 926 (Div. 2)

这场比赛我觉得题目不是特别难&#xff0c;就是有点难读懂&#xff0c;基本上读懂就差不多会做了。 Problem - A - Codeforces 1.思路&#xff1a; Q1&#xff1a;首先这个题我们一定能确定一个下界答案就是最大值减去最小值&#xff0c;那么我们怎样证明下界答案就是上界答案…

数值类型的运算方式总结

提纲1&#xff1a;常见的位运算使用场景 提纲2&#xff1a;整数类型运算时的类型溢出问题&#xff0c;产生原因以及解决办法 提纲3&#xff1a;浮点类型运算时的精度丢失问题&#xff0c;产生原因以及解决办法 数值类型&#xff08;6种&#xff09;分为&#xff1a; 整型&…

六、Datax通过json字符串运行

Datax通过json字符串运行 一、场景二、代码实现 一、场景 制作一个web应用&#xff0c;在页面上配置一个json字符串&#xff0c;保存在数据库里面。在执行json的时候&#xff0c;动态在本地创建一个json文件后执行&#xff0c;并识别是否成功&#xff0c;将执行过程保存在数据…

C++数据结构与算法——字符串

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

2024年【危险化学品经营单位安全管理人员】免费试题及危险化学品经营单位安全管理人员考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员免费试题参考答案及危险化学品经营单位安全管理人员考试试题解析是安全生产模拟考试一点通题库老师及危险化学品经营单位安全管理人员操作证已考过的学员汇总&#xff0c;相对有效帮助…

WordPress作者页面链接的用户名自动变成16位字符串串插件Smart User Slug Hider

WordPress默认的作者页面URL链接地址格式为“你的域名/author/admin”&#xff0c;其中admin就是你的用户名&#xff0c;这样的话就会暴露我们的用户名。 为了解决这个问题&#xff0c;前面boke112百科跟大家分享了『如何将WordPress作者存档链接中的用户名改为昵称或ID』一文…

Linux进程间通信(二)-----system V共享内存

共享内存的概念 共享内存让不同进程看到同一份资源的方式就是&#xff0c;在物理内存当中申请一块内存空间&#xff0c;然后将这块内存空间分别与各个进程各自的页表之间建立映射&#xff0c;再在虚拟地址空间当中开辟空间并将虚拟地址填充到各自页表的对应位置&#xff0c;使得…

书生浦语大模型实战营-课程作业(3)

下载sentence_transformer的代码运行情况。sentence_transformer用于embedding&#xff08;转向量&#xff09; 本地构建持久化向量数据库。就是把txt和md文件抽取出纯文本&#xff0c;分割成定长&#xff08;500&#xff09;后转换成向量&#xff0c;保存到本地&#xff0c;称…

Python算法题集_二叉树的层序遍历

Python算法题集_二叉树的层序遍历 题102&#xff1a;二叉树的层序遍历1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【DFS递归】2) 改进版一【BFS迭代】3) 改进版二【BFS迭代循环】 4. 最优算法 本文为Python算法题集之一的代码示例 题102&am…

python 人脸检测器

import cv2# 加载人脸检测器 关键文件 haarcascade_frontalface_default.xml face_cascade cv2.CascadeClassifier(haarcascade_frontalface_default.xml)# 读取图像 分析图片 ren4.png image cv2.imread(ren4.png) gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 进行人脸…

数据密集型应用系统设计

数据密集型应用系统设计 原文完整版PDF&#xff1a;https://pan.quark.cn/s/d5a34151fee9 这本书的作者是少有的从工业界干到学术界的牛人&#xff0c;知识面广得惊人&#xff0c;也善于举一反三&#xff0c;知识之间互相关联&#xff0c;比如有个地方把读路径比作programming …

ESP32学习(4)——电脑远程控制LED灯

1.思路梳理 首先需要让ESP32连接上WIFI 然后创建udp socket 接着接收udp数据 最后解析数据&#xff0c;控制LED 2.代码实现 import network from socket import * from machine import Pin p2Pin(2,Pin.OUT)def do_connect(): #连接wifi wlan network.WLAN(network.STA_IF)…

122.乐理基础-五线谱-音程、度数、根音、冠音

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;五线谱的临时变音记号规则 上一个内容里练习的答案&#xff1a; 1-121看完就可以认识乐谱、熟悉乐谱了&#xff0c;从现在开始与识谱无关&#xff0c;与创作有关 参考图&#xff1a;音程与和弦只是为了撬开去往和…

Vue2学习第一天

Vue2 学习第一天 1. 什么是 vue? Vue 是一套用于构建用户界面的渐进式框架。 2. vue 历史 vue 是在 2013 年创建的&#xff0c;vue3 是 2020 出现的&#xff0c;现在主要是用 vue2&#xff0c;创新公司用的是 vue3 vue 的作者是尤雨溪&#xff0c;vue 的搜索热度比 react…

jacob使用教程---OFFICE操作几乎万能公式---读写XML

参考资料: jacob的GitHub地址https://github.com/freemansoft/jacob-project jacob官网(个人感觉不重要)https://danadler.com/tech-articles/jacob-2/ microsoft官方VBA文档(很重要,jacob所有的参数都来自于这里)https://learn.microsoft.com/zh-cn/office/vba/api/o…

多线程的基本原理学习

由一个问题引发的思考 线程的合理使用能够提升程序的处理性能&#xff0c;主要有两个方面&#xff0c;第一个是能够利用多核cpu以及超线程技术来实现线程的并行执行&#xff1b;第二个是线程的异步化执行相比于同步执行来说&#xff0c;异步执行能够很好的优化程序的处理性能提…

【Day42】代码随想录之动态规划0-1背包_416. 分割等和子集

文章目录 动态规划理论基础动规五部曲&#xff1a;出现结果不正确&#xff1a; 416. 分割等和子集 动态规划理论基础 动规五部曲&#xff1a; 确定dp数组 下标及dp[i] 的含义。递推公式&#xff1a;比如斐波那契数列 dp[i] dp[i-1] dp[i-2]。初始化dp数组。确定遍历顺序&am…

【JAVA-Day87】线程终止问题

线程终止问题 线程终止问题&#xff0c;什么情况下需要终止线程&#xff0c;如何终止Java线程&#xff1f;摘要引言1. 理解线程终止&#xff1a;它代表什么&#xff1f;&#x1f6d1;线程终止的方式线程终止的含义注意事项示例代码 2. 何时需要终止线程&#xff1f;&#x1f91…

新机Word/PowerPoint新建空白文档后闪退问题

首先可以尝试一下常规的修复&#xff1a; 设置-应用-安装的应用-搜索office-点击Micros Office Home and Student...右侧三个点-选择修改-点击是-快速修复-修复 再不行就按上面的选择联机修复&#xff0c;这个会卸载现有Office然后自动帮你重新下载 我做了以上两个都没有解决问…