os模块篇(三)
专栏目录
文章目录
- 专栏目录
- os.putenv(key, value, /)
- os.setegid(egid, /)
- os.seteuid(euid, /)
- os.setgid(gid, /)
- os.setgroups(groups, /)
- os.setns(fd, nstype=0)
- os.setpgrp()
- os.setpgid(pid, pgrp, /)
- os.setpriority(which, who, priority)
os.putenv(key, value, /)
os.putenv(key, value) 是 Python 中的一个方法,用于设置环境变量。这个方法属于 os 模块,该模块提供了许多与操作系统交互的功能。
os.putenv(key, value) 的参数如下:
- key: 环境变量的名称(字符串)。
- value: 环境变量的值(字符串)。
使用 os.putenv 设置的环境变量只影响当前进程及其子进程。当当前进程结束时,这些环境变量不会影响到其他进程或系统环境。
下面是一个简单的示例:
import os# 设置环境变量
os.putenv('MY_ENV_VAR', 'Hello, World!')# 获取并打印环境变量的值
print(os.getenv('MY_ENV_VAR')) # 输出: Hello, World!
然而,在 Python 中更常用的方法是使用 os.environ 字典来设置和获取环境变量,因为它提供了更直观和方便的方式来操作环境变量。例如:
import os# 设置环境变量
os.environ['MY_ENV_VAR'] = 'Hello, World!'# 获取并打印环境变量的值
print(os.environ['MY_ENV_VAR']) # 输出: Hello, World!
这两种方法(os.putenv 和 os.environ)都可以用来设置环境变量,但使用 os.environ 通常更为简洁和方便。
os.setegid(egid, /)
os.setegid(egid) 是 Python 的 os 模块中的一个函数,用于设置当前进程的有效组 ID(effective group ID)。在 Unix 和类 Unix 系统中,每个进程都有一个组 ID(group ID)和一个有效组 ID,它们通常用于确定进程对文件和其他资源的访问权限。
os.setegid(egid) 的参数是:
- egid: 一个整数,表示要设置的有效组 ID。
请注意,只有超级用户(root)才能成功更改有效组 ID。对于非 root 用户,尝试更改有效组 ID 通常会引发 PermissionError。
使用 os.setegid() 时要小心,因为更改进程的有效组 ID 可能会影响该进程对文件系统和其他资源的访问权限。
下面是一个简单的示例,展示了如何使用 os.setegid():
import os# 获取当前进程的有效组 ID
current_egid = os.getegid()
print(f"Current effective group ID: {current_egid}")# 尝试设置新的有效组 ID
# 注意:这里假设您有足够的权限来更改有效组 ID
try:os.setegid(1000) # 假设 1000 是您想设置的新组 IDprint("Effective group ID changed successfully.")
except PermissionError:print("Permission denied. Unable to change effective group ID.")# 再次获取并打印有效组 ID,以确认是否更改成功
new_egid = os.getegid()
print(f"New effective group ID: {new_egid}")
在上面的代码中,我们首先使用 os.getegid() 获取当前进程的有效组 ID,然后尝试使用 os.setegid() 设置一个新的有效组 ID。请注意,由于权限限制,这个操作可能会失败。最后,我们再次使用 os.getegid() 来验证有效组 ID 是否已更改。
在实际应用中,更改进程的有效组 ID 通常不是必需的,除非你正在编写需要特定权限级别的系统级程序或服务。在大多数情况下,使用标准文件 I/O 函数和文件权限管理就可以满足需求。
os.seteuid(euid, /)
os.seteuid(euid) 是 Python 的 os 模块中的一个函数,用于设置当前进程的有效用户 ID(effective user ID)。有效用户 ID 是 Unix 和类 Unix 系统中进程的一个属性,它决定了进程对文件的访问权限和其他一些系统操作的权限。
os.seteuid(euid) 的参数是:
- euid: 一个整数,表示要设置的有效用户 ID。
和 os.setegid() 一样,只有超级用户(root)才能成功更改有效用户 ID。对于非 root 用户,尝试更改有效用户 ID 通常会引发 PermissionError。
下面是使用 os.seteuid() 的一个简单示例:
import os# 获取当前进程的有效用户 ID
current_euid = os.geteuid()
print(f"Current effective user ID: {current_euid}")# 尝试设置新的有效用户 ID
# 注意:这里假设您有足够的权限来更改有效用户 ID
try:os.seteuid(1000) # 假设 1000 是您想设置的新用户 IDprint("Effective user ID changed successfully.")
except PermissionError:print("Permission denied. Unable to change effective user ID.")# 再次获取并打印有效用户 ID,以确认是否更改成功
new_euid = os.geteuid()
print(f"New effective user ID: {new_euid}")
在上面的代码中,我们首先使用 os.geteuid() 获取当前进程的有效用户 ID,然后尝试使用 os.seteuid() 设置一个新的有效用户 ID。和 os.setegid() 一样,由于权限限制,这个操作可能会失败。最后,我们再次使用 os.geteuid() 来验证有效用户 ID 是否已更改。
请注意,更改进程的有效用户 ID 是一个高级操作,通常只有当你需要编写需要特定权限级别的系统级程序或服务时才会这么做。在大多数情况下,应用程序不应该需要更改其有效用户 ID。
os.setgid(gid, /)
os.setgid(gid) 是 Python 的 os 模块中的一个函数,用于设置当前进程的组 ID(group ID)。在 Unix 和类 Unix 系统中,每个进程都有一个组 ID,它决定了进程对文件和其他资源的访问权限。
os.setgid(gid) 的参数是:
- gid: 一个整数,表示要设置的组 ID。
与 os.setegid() 不同,os.setgid() 设置的是实际组 ID(real group ID),而不是有效组 ID。实际组 ID 是进程创建时继承的组 ID,而有效组 ID 用于决定进程的文件访问权限。
请注意,只有超级用户(root)才能成功更改实际组 ID。对于非 root 用户,尝试更改实际组 ID 通常会引发 PermissionError。
下面是一个使用 os.setgid() 的示例:
import os# 获取当前进程的实际组 ID
current_gid = os.getgid()
print(f"Current real group ID: {current_gid}")# 尝试设置新的实际组 ID
# 注意:这里假设您有足够的权限来更改实际组 ID
try:os.setgid(1000) # 假设 1000 是您想设置的新组 IDprint("Real group ID changed successfully.")
except PermissionError:print("Permission denied. Unable to change real group ID.")# 再次获取并打印实际组 ID,以确认是否更改成功
new_gid = os.getgid()
print(f"New real group ID: {new_gid}")
在上面的代码中,我们首先使用 os.getgid() 获取当前进程的实际组 ID,然后尝试使用 os.setgid() 设置一个新的实际组 ID。和 os.setegid() 一样,由于权限限制,这个操作可能会失败。最后,我们再次使用 os.getgid() 来验证实际组 ID 是否已更改。
在大多数应用程序中,更改进程的实际组 ID 不是必需的。通常,更改有效组 ID(使用 os.setegid())就足够了,因为它决定了进程的文件访问权限。实际组 ID 更多的是在系统编程和创建新进程时用到。
os.setgroups(groups, /)
os.setgroups(groups) 是 Python 的 os 模块中的一个函数,用于设置当前进程的所有组 ID(group IDs)。这个函数允许你更改进程所属的所有组的列表。
os.setgroups(groups) 的参数是:
- groups: 一个整数列表,表示要设置的所有组 ID。
需要注意的是,只有超级用户(root)才能更改进程的所有组 ID 列表。对于非 root 用户,尝试调用 os.setgroups() 通常会引发 PermissionError。
这个函数将替换当前进程的所有组 ID,而不是添加新的组 ID 到现有的列表中。如果 groups 参数为空列表,则进程将没有任何附加组。
下面是一个使用 os.setgroups() 的示例:
import os# 获取当前进程的所有组 ID
current_groups = os.getgroups()
print(f"Current group IDs: {current_groups}")# 尝试设置新的所有组 ID
# 注意:这里假设您有足够的权限来更改所有组 ID
try:new_groups = [1000, 2000] # 假设 1000 和 2000 是您想设置的组 IDos.setgroups(new_groups)print("Group IDs changed successfully.")
except PermissionError:print("Permission denied. Unable to change group IDs.")# 再次获取并打印所有组 ID,以确认是否更改成功
new_groups = os.getgroups()
print(f"New group IDs: {new_groups}")
在上面的代码中,我们首先使用 os.getgroups() 获取当前进程的所有组 ID,然后尝试使用 os.setgroups() 设置一个新的组 ID 列表。和前面的函数一样,由于权限限制,这个操作可能会失败。最后,我们再次使用 os.getgroups() 来验证所有组 ID 是否已更改。
在实际应用中,更改进程的所有组 ID 列表通常不是必需的,除非你需要精细控制进程对文件和其他资源的访问权限。在大多数情况下,使用标准文件 I/O 函数和文件权限管理就可以满足需求。
os.setns(fd, nstype=0)
os.setns(fd, nstype=0) 是 Python 3.8 版本中新增的 os 模块函数,用于将当前进程设置到一个新的命名空间(namespace)中。Linux 命名空间是 Linux 内核提供的一种隔离机制,允许系统的一部分视图(如进程、网络、挂载点等)对不同的进程看起来是不同的。这有助于实现容器化技术,如 Docker 和 LXC。
os.setns() 函数的参数是:
- fd: 一个文件描述符,通常是通过打开 /proc/[pid]/ns/[type] 文件获得的,其中 [pid] 是目标命名空间的进程 ID,[type] 是命名空间类型(如 pid、net、mnt、uts、ipc 或 user)。
- nstype: 一个可选参数,用于指定命名空间的类型。如果不指定,则从 fd 中推断。
命名空间类型包括:
- pid: 进程命名空间,隔离进程 ID。
- net: 网络命名空间,隔离网络设备和地址。
- mnt: 挂载命名空间,隔离文件系统挂载点。
- uts: UTS 命名空间,隔离主机名和域名。
- ipc: IPC 命名空间,隔离进程间通信资源。
- user: 用户命名空间,隔离用户 ID 和组 ID。
os.setns() 函数将当前进程加入到由 fd 指定的命名空间中,并返回 0 表示成功,否则返回 -1 并设置 errno 以指示错误。
下面是一个使用 os.setns() 的简单示例,该示例将当前进程加入到目标进程的 PID 命名空间中:
import os# 获取目标进程的 PID
target_pid = 1234# 打开目标进程的 PID 命名空间
ns_path = f"/proc/{target_pid}/ns/pid"
with open(ns_path, "r") as ns_file:ns_fd = ns_file.fileno()try:# 将当前进程加入到目标进程的 PID 命名空间中os.setns(ns_fd)print("Successfully set namespace.")except OSError as e:print(f"Failed to set namespace: {e}")# 关闭文件描述符os.close(ns_fd)
请注意,由于 os.setns() 需要超级用户权限来更改命名空间,因此在非特权进程中使用它通常会失败。此外,错误处理在上述示例中是基本的,实际使用中可能需要更详细的错误处理逻辑。
这个函数在编写需要深入操作系统级别的应用程序(如容器管理工具或系统级服务)时非常有用。在普通应用程序开发中,通常不需要使用 os.setns()。
os.setpgrp()
os.setpgrp() 是 Python 的 os.os.setpgid() 的别名,用于设置当前进程的进程组 ID(process group ID)。进程组是一个或多个进程的集合,通常用于信号传递和作业控制。
os.setpgrp() 没有参数,它会将当前进程加入到当前会话(session)的新进程组中,并将当前进程设置为该进程组的领头进程(leader)。如果调用成功,该函数返回 0;如果失败,则引发 OSError。
在 Unix 和类 Unix 系统中,每个进程都有一个进程组 ID,它可以通过 os.getpgrp() 函数获取。进程组通常用于将一组相关的进程组合在一起,以便通过终端(terminal)或其他控制机制进行统一管理。
请注意,只有进程组的领头进程才能调用 os.setpgrp()。非领头进程尝试调用此函数将会失败。
下面是一个使用 os.setpgrp() 的示例:
import os# 获取当前进程的进程组 ID
current_pgrp = os.getpgrp()
print(f"Current process group ID: {current_pgrp}")# 尝试设置新的进程组 ID
try:os.setpgrp()print("Process group ID changed successfully.")
except OSError as e:print(f"Failed to change process group ID: {e}")# 再次获取并打印进程组 ID,以确认是否更改成功
new_pgrp = os.getpgrp()
print(f"New process group ID: {new_pgrp}")
在上面的代码中,我们首先使用 os.getpgrp() 获取当前进程的进程组 ID,然后尝试使用 os.setpgrp() 设置新的进程组 ID。如果调用成功,进程组 ID 应该会发生变化。由于只有领头进程才能更改进程组 ID,因此非领头进程执行此代码可能会失败。
请注意,os.setpgrp() 在 Python 3.4 之后被标记为已弃用,并且在 Python 3.8 中被移除。如果您正在使用较新版本的 Python,您可能需要使用其他方法来设置进程组 ID,例如通过 os.setpgid(os.getpid(), os.getpid())。
os.setpgid(pid, pgrp, /)
os.setpgid(pid, pgrp) 是 Python 的 os 模块中的一个函数,用于将指定的进程 pid 移动到新的进程组 pgrp 中。这个函数主要用于改变现有进程的进程组归属。
参数说明:
- pid: 要移动的进程的进程 ID。
- pgrp: 目标进程组的 ID。
调用 os.setpgid() 时,进程 pid 会被移动到进程组 pgrp 中。如果 pid 等于 0,则调用进程本身会移动到进程组 pgrp 中。
需要注意的是,只有具有足够权限的进程(通常是进程组的领头进程或者超级用户)才能成功调用 os.setpgid()。
以下是一个使用 os.setpgid() 的示例:
import os# 获取当前进程的进程 ID
current_pid = os.getpid()# 获取当前进程的进程组 ID
current_pgrp = os.getpgrp()print(f"Current PID: {current_pid}")
print(f"Current PGRP: {current_pgrp}")# 假设我们有一个目标进程 ID 和目标进程组 ID
target_pid = 1234 # 替换为你想移动的进程的 PID
target_pgrp = 5678 # 替换为你想将进程移动到的进程组 PGRPtry:# 尝试将目标进程移动到新的进程组os.setpgid(target_pid, target_pgrp)print(f"Process {target_pid} moved to process group {target_pgrp} successfully.")
except PermissionError:print("Permission denied. Unable to move process to the new process group.")# 再次获取并打印当前进程的进程组 ID,以确认是否更改成功
new_pgrp = os.getpgrp()
print(f"New PGRP after operation: {new_pgrp}")
在上面的代码中,我们首先获取了当前进程的 PID 和 PGRP,然后尝试将目标进程 target_pid 移动到新的进程组 target_pgrp 中。如果操作成功,将打印相应的成功消息;否则,将捕获 PermissionError 并打印错误消息。
需要注意的是,os.setpgid() 在 Python 3.4 之后被标记为已弃用,并且在 Python 3.8 中被移除。如果你正在使用较新版本的 Python,并且需要设置进程组,你可能需要使用 os.setpgrp()(对于当前进程)或 os.killpg(pgrp, signal)(向进程组发送信号)等替代方法。
os.setpriority(which, who, priority)
os.setpriority(which, who, priority) 是 Python 的 os 模块中的一个函数,用于设置进程或线程的调度优先级。这个函数在 Unix-like 系统上有效,但在 Windows 上并不可用。
函数的参数如下:
-
which: 指定要设置优先级的对象类型。这可以是以下常量之一:
- os.PRIO_PROCESS: 设置进程的优先级。
- os.PRIO_PGRP: 设置进程组的优先级。
- os.PRIO_THREAD: 设置线程的优先级(在支持线程优先级的系统上)。
-
who: 指定要设置优先级的进程、进程组或线程的标识符。对于 os.PRIO_PROCESS,who 是进程的 PID;对于 os.PRIO_PGRP,who 是进程组的 PGID;对于 os.PRIO_THREAD,who 是线程的 TID。
-
priority: 指定新的优先级值。具体的取值范围和含义取决于 which 参数和操作系统。
调用 os.setpriority(which, who, priority) 后,操作系统会尝试调整指定对象(进程、进程组或线程)的调度优先级。这通常涉及到内核调度算法中的优先级设置,但实际效果取决于操作系统的实现和当前系统的负载情况。
需要注意的是,只有具有足够权限的进程(通常是超级用户或进程的所有者)才能成功调用 os.setpriority() 来改变其他进程的优先级。此外,不是所有的 Unix-like 系统都支持所有的优先级设置选项。
以下是一个使用 os.setpriority() 的示例,尝试提高当前进程的优先级:
import os# 获取当前进程的 PID
current_pid = os.getpid()# 设置当前进程的优先级
try:# 尝试提高当前进程的优先级# 注意:具体的优先级值取决于操作系统和可用选项os.setpriority(os.PRIO_PROCESS, current_pid, 10)print("Process priority changed successfully.")
except PermissionError:print("Permission denied. Unable to change process priority.")
except ValueError:print("Invalid priority value.")
在上面的代码中,我们尝试提高当前进程的优先级。但是,如果当前进程没有足够的权限,或者提供的优先级值无效,调用将失败并抛出异常。
相关文章:
os模块篇(三)
专栏目录 文章目录 专栏目录os.putenv(key, value, /)os.setegid(egid, /)os.seteuid(euid, /)os.setgid(gid, /)os.setgroups(groups, /)os.setns(fd, nstype0)os.setpgrp()os.setpgid(pid, pgrp, /)os.setpriority(which, who, priority) os.putenv(key, value, /) os.puten…...
kvm虚拟机迁移--来自gpt
离线迁移 离线迁移KVM虚拟机主要涉及将虚拟机完全关闭,然后移动虚拟机的磁盘文件和配置文件到新的宿主机上,并在新宿主机上启动虚拟机。下面是具体的步骤和命令: 步骤 1: 关闭虚拟机 首先,在源宿主机上关闭目标虚拟机。确保虚拟…...

用Typora+picgo+cloudflare+Telegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南)
用TyporapicgocloudflareTelegraph-image的免费,无需服务器,无限空间的图床搭建(避坑指南) 前提:有github何cloudflare (没有的话注册也很快) 首先,是一个别人写的详细的配置流程,傻瓜式教程&am…...

鸿蒙TypeScript开发入门学习第3天:【TS基础类型】
1、TypeScript 基础类型 TypeScript 包含的数据类型如下表: 注意: TypeScript 和 JavaScript 没有整数类型。 2、Any 类型 任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。 1、变量的值会动态改变时&…...

gitee 本地文件提交到仓库
一、准备工作 1.下载Git Bash Git Bash官网下载地址 http://www.git-scm.com/download/ 点此跳转 2.注册或登录gitee gitee官网地址 https://gitee.com/ 点此跳转 没有账号选择注册有账号的话直接登陆 3.在gitee中新建一个空的仓库 登陆成功后点进个人主页,点击…...
TemperatureTop-kTop-p
一、温度 在语言模型中使用温度(temperature)这个参数是为了控制文本生成过程中的随机性和可预测性。这个概念来自于统计力学中的温度概念,在那里它用来描述系统的熵(或随机性)水平。在语言模型中,输出概率…...
HTTP 协议中常用的两种请求方法:get请求与post请求
一、get请求 (1)什么是 GET 请求? GET 请求是一种向服务器请求获取资源的方式。它通过 URL 将请求参数附加到请求中,并将请求发送给服务器。GET 请求通常用于获取数据,例如读取文章、获取用户信息等操作。 在Node.j…...

飞天使-k8s知识点28-kubernetes散装知识点5-helm安装ingress
文章目录 安装helm添加仓库下载包配置创建命名空间安装 安装helm https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gztar -xf helm-v3.2.3-linux-amd64.tar.gzcd linux-amd64mv helm /usr/local/bin修改/etc/profile 文件,修改里面内容,然后重新启用export PATH$P…...

linux i2c-tools使用总结
1,安装iic-tools sudo apt install i2c-tools -y 2,查看有几条iic总线 [root@sino-platform:/root]# ls /dev/i2c- i2c-0 i2c-1 i2c-2 i2c-3 3,查看i2c命令 [root@sino-platform:/root]# i2c i2cdetect i2cdump i2cget i2cset 4,iic-help命令 [root@sino-platform…...

App推广新篇章:Xinstall助力精准分析与优化
在当前的移动应用市场中,App推广已成为每个开发者不可或缺的一环。然而,推广并非简单的投放广告与等待用户下载,而是需要一套科学、系统的分析与优化流程。这正是Xinstall作为国内专业的App全渠道统计服务商,能够为您带来的核心价…...
vue知识点: v-if和v-for为何不能同时使用?
在vue2和vue3的官方文档里都写到不推荐 v-if和v-for同时使用,如下代码所示: <li v-for"todo in todos" v-if"!todo.isComplete">{{ todo.text }} </li> 一、vue3文档:列表渲染 | Vue.js 在vue3中ÿ…...
2024.3.31力扣(1200-1400)刷题记录
一、1523. 在区间范围内统计奇数数目 1.模拟 class Solution:def countOdds(self, low: int, high: int) -> int:# 模拟return len(range(low,high1,2)) if low & 1 else len(range(low1,high1,2)) 2.数学 总结规律。首为偶数就向下取整;奇数就向上取整。…...

【核弹级软安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件
Red Hat 发布了一份“紧急安全警报”,警告称两款流行的数据压缩库XZ Utils(先前称为LZMA Utils)的两个版本已被植入恶意代码后门,这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094,其CVS…...

【Linux在程序运行时打印调用栈信息(函数名,文件行号等)】
在程序运行时打印相关调用栈信息(函数名,文件行号等),便于梳理调用逻辑等 //stack.c #include <stdio.h> #include <execinfo.h> #include <stdlib.h> #include <string.h> #include <stdbool.h>#define MAX_…...
9.包和工具【go】
在Go语言中,包是代码的组织单元,而工具链则是Go语言提供的命令行工具,用于构建、测试和调试Go代码。下面我将详细介绍如何导入和使用标准库中的包,如何编写自己的包,以及如何使用Go的工具链。 导入和使用标准库中的包 Go的标准库包含了许多预定义的包,你可以通过导入这…...
判断一个字符串是否是真实手机号:JavaScript
一个简单的正则表达式示例,用于匹配中国大陆的手机号: function isValidPhoneNumber(phoneNumber) {// 定义一个正则表达式,用于匹配中国大陆的手机号const phoneRegex /^1[3-9]\d{9}$/;// 使用正则表达式测试手机号是否匹配return phoneReg…...

3D检测:从pointnet,voxelnet,pointpillar到centerpoint
记录centerpoint学习笔记。目前被引用1275次,非常高。 地址:Center-Based 3D Object Detection and Tracking (thecvf.com) GitHub - tianweiy/CenterPoint CenterPoint:三维点云目标检测算法梳理及最新进展(CVPR2021ÿ…...
使用canvas内置api完成图片的缩放平移和导出和添加提示
最近挺忙的,几乎没有时间去更新博客,今天正好在学习新东西,正好和大家分享一下。 最近要做一个使用canvas完成图片平移,缩放,添加标注的需求,完成的效果大概如下: 使用canvas内置api完成图片的缩…...

数据结构——二叉树——堆
前言: 在前面我们已经学习了数据结构的基础操作:顺序表和链表及其相关内容,今天我们来学一点有些难度的知识——数据结构中的二叉树,今天我们先来学习二叉树中堆的知识,这部分内容还是非常有意思的,下面我们…...

算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)
算法学习——LeetCode力扣图论篇3 127. 单词接龙 127. 单词接龙 - 力扣(LeetCode) 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk: 每一对相…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...