当前位置: 首页 > news >正文

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

一、Linux 4.9内核bind系统调用代码注释

int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
{struct socket *sock;                     // 定义socket对象的指针struct sockaddr_storage address;         // 用于存储从用户空间复制过来的地址int err, fput_needed;                    // 错误码和文件指针释放标志// 通过文件描述符获取socket对象,并检查是否需要释放文件指针sock = sockfd_lookup_light(fd, &err, &fput_needed);if (sock) {  // 如果获取socket对象成功// 将用户空间的socket地址复制到内核空间err = move_addr_to_kernel(umyaddr, addrlen, &address);if (err >= 0) {  // 如果地址复制成功// 进行安全检查,判断是否允许绑定操作err = security_socket_bind(sock, (struct sockaddr *)&address, addrlen);if (!err)  // 安全检查通过// 调用协议层的bind函数完成实际的绑定操作err = sock->ops->bind(sock, (struct sockaddr *)&address, addrlen);}// 根据fput_needed标志决定是否释放文件指针fput_light(sock->file, fput_needed);}return err;  // 返回操作结果
}// 定义bind系统调用
SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
{// 调用__sys_bind函数,并返回其结果return __sys_bind(fd, umyaddr, addrlen);
}

二、代码解释

这段代码来自较老的版本的Linux内核,是`bind`系统调用的实现,其作用是将一个本地地址绑定到一个socket上。在Linux网络编程中,`bind`函数用于指定socket的本地地址,通常用在服务端指定端口号。下面将逐段用中文解读这段代码:

int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
{

定义了函数`__sys_bind`,它接收三个参数:一个文件描述符`fd`,一个指向用户空间socket地址的指针`umyaddr`,以及地址的长度`addrlen`。

    struct socket *sock;struct sockaddr_storage address;int err, fput_needed;

定义几个局部变量:`sock`用于存储内核中的socket对象的指针,`address`用于临时存储socket地址信息,`err`用于记录错误代码,`fput_needed`用于标记是否需要释放文件指针。

    sock = sockfd_lookup_light(fd, &err, &fput_needed);

通过文件描述符`fd`获取对应的socket对象,并将该对象的地址存入`sock`。此外,记录任何查找错误到`err`,并设定是否需要释放文件指针到`fput_needed`。

    if (sock) {

如果成功获取到了socket对象(即`sock`不为NULL)。

        err = move_addr_to_kernel(umyaddr, addrlen, &address);

将用户空间中的socket地址`umyaddr`复制到内核空间中的`address`变量中,检查地址的有效性,如果成功则`err`为非负值。

        if (err >= 0) {err = security_socket_bind(sock,(struct sockaddr *)&address,addrlen);

如果地址成功移动到内核空间,接着进行安全检查,看是否允许bind操作。

            if (!err)err = sock->ops->bind(sock,(struct sockaddr *)&address, addrlen);}

如果通过了安全检查,调用对应协议的`bind`函数,以进行实际的绑定操作。

        fput_light(sock->file, fput_needed);

完成绑定操作后,根据之前记录的`fput_needed`变量的值来决定是否释放文件指针。

    }return err;
}

返回操作结果,如果`err`为0,则表示绑定成功;如果为负值,则表示绑定过程中出现了错误。
最后是`SYSCALL_DEFINE3`宏定义的`bind`函数,这是一个宏来方便地定义具有三个参数的系统调用,并最终调用`__sys_bind`来完成实际的工作:

SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
{return __sys_bind(fd, umyaddr, addrlen);
}

这部分定义了系统调用`bind`,接收三个参数,内部简单地调用了`__sys_bind`函数,并返回它的返回值。这个宏用于定义一个系统调用,它定义了一个名为bind的系统调用,该系统调用接受三个参数:fdumyaddraddrlenSYSCALL_DEFINE3宏会生成一个系统调用的实现,该实现会将参数从用户空间复制到内核空间,然后调用__sys_bind函数来处理请求。

总之,这段代码实现了bind系统调用,它允许用户空间程序将套接字与本地地址和端口号关联起来。在绑定过程中,还进行了必要的安全检查和地址结构体的复制操作。

相关文章:

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

一、Linux 4.9内核bind系统调用代码注释 int __sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen) {struct socket *sock; // 定义socket对象的指针struct sockaddr_storage address; // 用于存储从用户空间复制过来的地址int err…...

Ubuntu下Anaconda+PyCharm搭建PyTorch环境

这里主要介绍在condapytorch都正确安装的前提下,如何通过pycharm建立开发环境; Ubuntu下AnacondaPyCharm搭建PyTorch环境 系统环境:Ubuntu22.04 conda: conda 23.11.0 pycharm:如下 condapytorch的安装教程介绍,请点击这里&…...

酷开科技荣获“消费者服务之星”称号后的未来展望

恭喜酷开科技荣获2023年第四季度黑猫平台“消费者服务之星”称号!这是对酷开科技长期以来坚持用户至上、用心服务的肯定和认可。作为OTT行业的佼佼者,酷开科技一直秉承着“以用户为中心”的服务理念,不断追求卓越品质,为用户提供更…...

UVA1449 Dominating Patterns 题解

UVA1449 Dominating Patterns 题解 板子题诶。 解法 AC 自动机模板题,因为数据范围比较小,所以不加拓扑排序优化建图即可通过本题。这里简单介绍一下拓扑排序优化建图。 在查找时,每次都暴力的条 f a i l fail fail 指针是很消耗时间的&…...

【C语言】数据结构#实现堆

目录 (一)堆 (1)堆区与数据结构的堆 (二)头文件 (三)功能实现 (1)堆的初始化 (2)堆的销毁 (3)插入数据 …...

AES加密中的CBC和ECB

目录 1.说明 2.ECB模式(base64) 3.CBC模式 4.总结 1.说明 AES是常见的对称加密算法,加密和解密使用相同的密钥,流程如下: 主要概念如下: ①明文 ②密钥 用来加密明文的密码,在对称加密算…...

【C++】类和对象(四)

前言:在类和对象中,我们走过了十分漫长的道路,今天我们将进一步学习类和对象,类和对象这块荆棘地很长,各位一起加油呀。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量&a…...

XGB-5: DART Booster

XGBoost 主要结合了大量的回归树和一个小的学习率。在这种情况下,早期添加的树是重要的,而晚期添加的树是不重要的。 Vinayak 和 Gilad-Bachrach 提出了一种将深度神经网络社区的 dropout 技术应用于梯度提升树的新方法,并在某些情况下报告了…...

HiveSQL——不使用union all的情况下进行列转行

参考文章: HiveSql一天一个小技巧:如何不使用union all 进行列转行_不 union all-CSDN博客文章浏览阅读881次,点赞5次,收藏10次。本文给出一种不使用传统UNION ALL方法进行 行转列的方法,其中方法一采用了concat_wsposexplode()方…...

Python环境下基于指数退化模型和LSTM自编码器的轴承剩余寿命预测

滚动轴承是机械设备中关键的零部件之一,其可靠性直接影响了设备的性能,所以对滚动轴承的剩余使用寿命(RUL)进行预测是十分必要的。目前,如何准确地对滚动轴承剩余使用寿命进行预测,仍是一个具有挑战的课题。对滚动轴承剩余寿命评估…...

无人机竞赛视觉算法开发流程开源计划(询问大家意见)

本科中参加过一系列的无人机机器人竞赛,像电赛、工训赛、机器人大赛这些,有一些比较常用的方案打算开源一下。现在读研了,也算是对本科的一个总结,但是还是想看看大家意见,大家有什么需求可以在评论区说,我…...

DMA直接内存访问,STM32实现高速数据传输使用配置

1、DMA运用场景 随着智能化、信息化的不断推进,嵌入式设备的数据处理量也呈现指数级增加,因此对于巨大的数据量处理的情况时,必须采取其它的方式去替CPU减负,以保证嵌入式设备性能。例如SD卡存储器和音视频、网络高速通信等其它情…...

Web安全研究(六)

文章目录 HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs文章结构Introjs obfuscationmethodologyExample HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs CCS 2019 CISPA 恶意软件领域,基于学习的系统已经非常流行&am…...

python3 中try 异常调试 raise 异常抛出

一、什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。 一般情况下,在Python无法正常处理程序时就会发生一个异常。 异常是Python对象,表示一个错误。 当Python脚本发生异常时我…...

Java中的序列化是什么?如何实现对象的序列化和反序列化?请解释Serializable接口的作用是什么?请解释transient关键字的作用是什么?为什么会使用它?

Java中的序列化是指将对象转换为字节序列的过程,以便可以在网络上传输或将其保存到持久存储介质中。反序列化则是将字节序列重新转换回对象的过程。Java提供了一种称为序列化(Serialization)的机制来实现对象的序列化和反序列化。 要实现对象…...

二维差分---三维差分算法笔记

文章目录 一.二维差分构造差分二维数组二维差分算法状态dp求b[i][j]数组的二维前缀和图解 二.三维前缀和与差分三维前缀和图解:三维差分核心公式图解:模板题 一.二维差分 给定一个原二维数组a[i][j],若要给a[i][j]中以(x1,y1)和(x2,y2)为对角线的子矩阵中每个数都加上一个常数…...

D. Divisible Pairs

思路:我们预处理出每个数分别摸上xy的值,用map存一下,然后遍历每个数,如果a b是x的倍数的话,那么他们模x的值相加为x,如果a - b是y的倍数的话,那么他们的模y的值相等。 代码: voi…...

【教程】Kotlin语言学习笔记(二)——数据类型(持续更新)

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 文章目录 【Kotlin语言学习】系列文章一、基本数据…...

react 插槽

问题开发当中会经常出现组件十分相似的组件&#xff0c;只有一部分是不同的 解决&#xff1a; 父组件:在引用的时候 import { Component } from "react"; import Me from "../me";const name <div>名称</div> class Shoop extends Compone…...

Linux运用fork函数创建进程

fork函数&#xff1a; 函数原型&#xff1a; pid_t fork(void); 父进程调用fork函数创建一个子进程&#xff0c;子进程的用户区父进程的用户区完全一样&#xff0c;但是内核区不完全一样&#xff1b;如父进程的PID和子进程的PID不一样。 返回值&#xff1a; RETURN VALUEO…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...