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

Linux 进程控制

文章目录

  • 进程创建
  • 进程终止
  • 进程结果
    • wait函数
    • waitpid函数
    • status参数
  • 进程替换
    • 进程替换原理
    • 进程替换函数
  • 补充/拓展

进程创建

  1. fork函数
#include <unistd.h>pid_t fork(void);

函数返回值

在父进程中,fork函数返回子进程的进程ID(PID)
在子进程中,fork函数返回0。
fork执行失败时返回-1. fork 执行失败的原因一般是系统资源不足

fork函数的一般使用逻辑:

int main() {pid_t pid = fork();if (pid < 0) {// fork失败,创建子进程失败fprintf(stderr, "Fork failed\n");return 1;} else if (pid == 0) {// 子进程执行的代码逻辑printf("This is the child process\n");// 子进程执行其他任务...} else {// 父进程执行的代码逻辑printf("This is the parent process, child PID: %d\n", pid);// 父进程执行其他任务...}return 0;
}

内核视角
分配新的内存块和内核数据结构给子进程
将父进程部分数据结构内容拷贝至子进程
添加子进程到系统进程列表当中
fork返回,开始调度器调度

进程终止

进程终止的原因

  1. main函数返回
return n**等同于执行exit(n**),因为调用main的运行时函数会将main的返回值当做 exit的参数。
  1. exit函数返回
  2. _exit函数返沪
#include <unistd.h>void _exit(int status);

status 定义了进程的终止状态,父进程通过wait来获取该值
虽然status是int,但是仅有低8位可以被父进程所用。所以_exit(-1)时,在终端执行$?发现返回值
是255。

  1. 信号终止

_exit函数和exit函数说明:

  1. _exit函数
_exit函数是一个系统调用函数,用于立即终止程序的执行,不会执行任何清理工作,包括关闭文件、释放内存等。
它的原型为:void _exit(int status)。
status参数表示程序的终止状态,通常0表示正常终止,非零值表示异常终止。
_exit函数不会刷新缓冲区,也不会调用任何终止处理程序,直接退出程序。
  1. exit函数:
exit函数是标准库函数,用于终止程序的执行,并执行一些清理工作,如关闭文件、释放内存等。
它的原型为:void exit(int status)。
status参数表示程序的终止状态,通常0表示正常终止,非零值表示异常终止。
exit函数会先刷新缓冲区,然后调用终止处理程序(通过atexit注册的函数),最后退出程序。

在这里插入图片描述

进程结果

获取进程结果的方法

  1. 命令获取
  echo $?

$?是一个特殊变量,用于获取上一个命令的退出状态码。退出状态码是一个整数值,表示上一个命令的执行结果

  1. 父进程进程调用函数等待

wait函数

#include <sys/types.h>
#include <sys/wait.h>pid_t wait(int *status);

参数
status是一个指向整型变量的指针,用于存储子进程的退出状态。
如果不关心子进程的退出状态,可以将status设置为NULL。
返回值
wait()函数的返回值是子进程的进程ID,如果出错则返回-1。
如果当前进程没有子进程,返回-1,并设置errno为ECHILD
如果调用被信号中断,返回-1,并设置errno为EINTR

waitpid函数

#include <sys/types.h>
#include <sys/wait.h>pid_t waitpid(pid_t pid, int *status, int options);

参数
pid:
pid > 0:等待进程ID为pid的子进程。
pid = -1:等待任意子进程,与wait函数相同。
pid = 0:等待与当前进程的进程组ID相同的任意子进程。

status:
输入输出型参数,一个指向整型的指针,用于获取子进程的终止状态。

options:
WNOHANG: 若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。
若正常结束,则返回该子进程的ID。

返回值
如果成功等待到子进程的终止,返回子进程的进程ID;
如果指定的子进程尚未终止,并且使用了WNOHANG选项,则返回0;
如果调用被信号中断,返回-1,并设置errno为EINTR;
如果指定的子进程不存在或不属于当前进程的子进程组,返回-1,并设置errno为ECHILD

status参数

status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图(只研究status低16比特
位),可以看到只有先判断进程是正常退出后,退出状态码才是有效的。
在这里插入图片描述

WIFEXITED 是一个(macro),用于检查 wait 或 waitpid 函数返回的子进程状态(status)是否是正常退出。WIFEXITED(status) 接受一个 status 参数,该参数是 wait 或 waitpid 函数返回的子进程状态信息。WIFEXITED 宏会对 status 进行解析,并返回一个非零值(true)表示子进程是正常退出的,返回零值(false)表示子进程不是正常退出的。

如果 WIFEXITED(status) 返回为真,可以使用 WEXITSTATUS(status) 宏来获取子进程的退出状态码。WEXITSTATUS(status) 会返回子进程的退出状态码,该状态码通常是在子进程调用 exit 或返回 main 函数时传递的值。

如果 WIFEXITED(status) 返回为假,可使用WTERMSIG(status),同样是通过wait或waitpid函数获取的子进程的终止状态。如果进程是由于收到信号而异常终止,则WTERMSIG宏返回信号的编号;否则,返回0。

具体使用:

#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>int main() 
{pid_t pid = fork();if (pid == 0) {// 子进程printf("This is child process\n");// 子进程正常退出,退出状态码为 42exit(42);} else if (pid > 0) {// 父进程int status;wait(&status);if (WIFEXITED(status)) {// 子进程正常退出int exit_status = WEXITSTATUS(status);printf("Child process exited with status: %d\n", exit_status);}else {// 子进程非正常退出WTERMSIG(int status); // WTERMSIG获取异常退出时信号的编号printf("Child process did not exit normally\n");}}else {// fork 出错perror("fork");return 1;}return 0;
}

进程替换

进程替换原理

当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动
例程开始执行,调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。结合下图,进程替换的本质是替换虚拟内存和物理内存/外存的映射关系,故这个过程保留了原进程的task_struct, 和原进程存储堆和栈区中的数据。

需要注意:

  1. 进程替换后,task_struct 结构体中执行流相关字段会被重置,新的程序加载进来的代码从main函数重新开始执行
  2. 环境变量存储在环境变量表中,环境变量表也是task_struct的一个字段,所以进行进程切换的用户可以通过调用不同类型的进程替换函数来决定是否保留环境变量
  3. 进程替换本质没有创建新的task_struct, 也就是说没有创建新的进程,故进程ID不变。
  4. 堆、栈区数据被保留
  5. 文件描述符存储在文件描述表中,文件描述符表存储在task_struct中,所以如果在进程替换前如果对文件描述符进行了重定向,重定向的效果会保留到进程替换过后的进程里 。

在这里插入图片描述

进程替换函数

#include <unistd.h>`int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);

返回值::
成功无返回值
失败返回 -1
参数
path :可执行文件绝对路径
file :可执行文件名
arg : 可变参数列表
envp : 环境变量数组
argv : 参数数组
在这里插入图片描述
记忆方法:
l(list) : 表示参数采用列表
v(vector) : 参数用数组
p(path) : 有p自动搜索环境变量PATH
e(env) : 表示自己维护环境变量

补充/拓展

  1. 终止信号: 下图前31种信号为进程异常退出时可能接收的信号,信号的具体含义可通过man手册查明。
man 7 signal

在这里插入图片描述

  1. 核心转储
    有时在本地运行程序时会报错:Segmentation fault (core dumped) ,这表明发生了核心转储。

Linux核心转储(coredump)是指在程序发生崩溃或异常终止时,将程序在崩溃时的内存状态保存到磁盘上的一个文件中。这个文件可以用于调试程序,找出导致程序崩溃的原因。

在Linux系统中,当一个程序崩溃时,默认情况下会生成一个核心转储文件。这个文件包含了程序崩溃时的内存映像、寄存器状态、堆栈信息等。通过分析这个文件,开发人员可以确定程序崩溃的原因,并进行调试。

要启用核心转储功能,可以通过设置ulimit命令来控制。ulimit命令用于设置shell进程的资源限制,其中包括核心转储文件的大小限制。可以使用ulimit -c命令来查看当前的核心转储文件大小限制,使用ulimit -c unlimited命令来设置核心转储文件的大小为无限制。

当程序崩溃时,核心转储文件会被保存在当前工作目录下。可以使用gdb调试器来分析核心转储文件。例如,可以使用gdb程序名核心转储文件来加载核心转储文件并进行调试。

需要注意的是,核心转储文件可能会非常大,因此在生产环境中可能需要限制核心转储文件的大小,以避免磁盘空间被耗尽。另外,核心转储文件可能包含敏感信息,因此在共享或提交给第三方时需要谨慎处理。

  1. 进程替换的实际使用(位于代码调用cgi模式的部分)
    个人代码练习

相关文章:

Linux 进程控制

文章目录 进程创建进程终止进程结果wait函数waitpid函数status参数 进程替换进程替换原理进程替换函数 补充/拓展 进程创建 fork函数 #include <unistd.h>pid_t fork(void);函数返回值&#xff1a; 在父进程中&#xff0c;fork函数返回子进程的进程ID&#xff08;PID&…...

[ Linux Audio 篇 ] 音频开发入门基础知识

在短视频兴起的背景下&#xff0c;音视频开发越来越受到重视。接下来将为大家介绍音频开发者入门知识&#xff0c;帮助读者快速了解这个领域。 轻柔的音乐、程序员有节奏感的键盘声、嗡嗡的发动机、刺耳的手提钻……这些声音是如何产生的呢&#xff1f;又是如何传到我们耳中的…...

关于高校电子邮件系统开通双因素认证的经验分享-以清华大学为例

清华大学信息化技术中心 马云龙 作者简介: 马云龙,男,清华大学信息化技术中心高级工程师;Coremail管理员社区大咖嘉宾 深耕高校计算机网络/信息化/网络安全岗位20年,对大规模计算机网络及信息系统规划,开发/建设,运维有深刻体会。 目前,越来越多的高校/企业/政府机关…...

「Swift」类淘宝商品瀑布流展示

前言&#xff1a;需要做一个类似于淘宝商品页面的瀑布流展示 结构分析&#xff1a; ps&#xff1a;图片来源 思路分析&#xff1a; 该瀑布流主要还是基于UICollectionView进行展示&#xff0c;只是在cell展示的UICollectionViewFlowLayout需要进行相应调整和自定义&#xff…...

道可云会展元宇宙平台全新升级,打造3D沉浸式展会新模式

随着VR虚拟现实、人工智能、虚拟数字人等元宇宙技术的快速发展&#xff0c;各个行业正试图通过元宇宙技术寻求新的发展突破口&#xff0c;会展行业也不例外。会展作为经贸领域的重要产业形态&#xff0c;越来越多的企业和组织开始寻求通过元宇宙技术为展会赋能&#xff0c;以满…...

Ant Design Pro初始化报错

今天按照官网步骤初始化项目&#xff0c;第一次报错 fatal: unable to access https://github.com/ant-design/ant-design-pro/: SSL certificate problem: unable to get local issuer certificate 致命&#xff1a;无法访问https://github.com/ant-design/ant-design-pro/&…...

第16届中国R会议暨2023X-AGI大会开幕,和鲸科技分享ModelOps在数据科学平台中的实践与应用

11月25日&#xff0c;第 16 届中国 R 会议暨 2023 X-AGI 大会在在中国人民大学逸夫会堂拉开帷幕&#xff0c;本次会议由中国人民大学统计学院、中国人民大学应用统计科学研究中心、统计之都、原灵科技和中国商业统计学会人工智能分会&#xff08;筹&#xff09;主办&#xff0c…...

❀My学习Linux命令小记录(12)❀

目录 ❀My学习Linux命令小记录&#xff08;12&#xff09;❀ 46.arp指令 47.tcpdump指令 48.chmod指令 49.chown指令 50.bash调用脚本指令 shell介绍 shell脚本的组成部分 脚本执行方式 检查脚本语法 bash之变量 变量的种类&#xff1a;根据生效的范围不同来区分 …...

MySQL学习day05

DCL&#xff08;Data Control Language&#xff09;数据控制语言学习 作用&#xff1a;用来创建数据库用户、控制数据库的访问权限 1&#xff09;查询用户&#xff1a; use mysql; select * from user; 2&#xff09;创建用户&#xff1a; create user 用户名主机名 identifi…...

JAVA面试题7

1.Java中的ClassLoader是什么&#xff1f; 它有什么作用&#xff1f; 答案&#xff1a;ClassLoader是一种加载Java类文件的机制&#xff0c;可以从不同的来源加载类文件&#xff0c;如本地文件系统、网络等。ClassLoader可以帮助实现模块化开发和动态加载类等功能。 2.什么是J…...

好用免费的AI换脸5个工具

在当今社会的发展中&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;扮演着关键的角色&#xff0c;其应用领域不断扩展。作为AI的一个分支&#xff0c;换脸技术近年来备受欢迎。这项技术使得将一个人的面部特征迁移到另一个人的照片或视频成为可能。除…...

【Linux】公网远程访问AMH服务器管理面板

目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板&#xff0c;它提供了一系列的功能&#xff0c;包括网站管理、FTP 管理、数据库管理、DNS 管理、…...

随笔-这都是命吗

我与鹏哥、小付有个小群&#xff0c;前几天&#xff0c;鹏哥在群里发了一个图&#xff0c;是他那个城市准备扶持的高新产业&#xff0c;有元宇宙、量子信息、生物制药、人工智能什么的。 先前的时候鹏哥给我说过&#xff0c;当地准备了六百多亩地&#xff0c;准备发展高新产业…...

优化网站性能,从容谈CDN加速的部署与运维

随着互联网的迅猛发展&#xff0c;网站的性能优化成为网站运维工作中不可或缺的一环。其中&#xff0c;CDN&#xff08;Content Delivery Network&#xff09;加速技术因其在全球范围内提供快速、可靠的内容分发而备受关注。本文将从一个网站运维的角度出发&#xff0c;深入探讨…...

JavaScript-事件

事件 事件流 指的是事件完整执行过程中的流动路径 两个阶段&#xff1a; 捕获阶段&#xff1a;从大到小冒泡阶段&#xff1a;从小到大 实际开发中都是使用事件冒泡为主 事件捕获 从DOM的根元素开始取执行对应的事件&#xff08;从外到里&#xff09; document.addEventLis…...

linux的磁盘管理

Linux 提供了多种工具和技术来进行磁盘管理。下面是对 Linux 磁盘管理的详细解释&#xff1a; 磁盘和分区&#xff1a; 磁盘&#xff08;硬盘&#xff09;&#xff1a;Linux 系统中的磁盘通常是通过 SATA、SCSI、NVMe 等接口连接的物理硬盘。可以使用工具如 lsblk、fdisk、pa…...

qt-C++笔记之主线程中使用异步逻辑来处理ROS事件循环和Qt事件循环解决相互阻塞的问题

qt-C笔记之主线程中使用异步逻辑来处理ROS事件循环和Qt事件循环解决相互阻塞的问题 code review! 文章目录 qt-C笔记之主线程中使用异步逻辑来处理ROS事件循环和Qt事件循环解决相互阻塞的问题1.Qt的app.exec()详解2.ros::spin()详解3.ros::AsyncSpinner详解4.主线程中结合使用…...

【Docker】从零开始:18.使用Dockerfile构造自己的KingbaseES数据库镜像

【Docker】从零开始&#xff1a;17.使用Dockerfile构造自己的数据库镜像 新建一个自定义目录并创建Dockerfile文件上传需要的文件到自定义目录下注意docker-circle-init.sh文件内容password 内容 开始打包注意打包完成后执行 尝试用工具连接数据库 kingbase.tar.gz 包过大我就上…...

YOLOv8独家改进《全网无重复 YOLOv8专属打造》感知聚合SERDet检测头:简单高效涨点,即插即用|检测头新颖改进

💡本篇内容:YOLOv8独家改进《全网无重复,YOLOv8专属》感知聚合SERDet检测头:高效涨点,即插即用|检测头新颖改进 💡🚀🚀🚀本博客 YOLO系列 + 全新原创感知聚合SERDet检测头 改进创新点改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可,附改进源代…...

Android Studio中Flutter项目找不到Android真机设备解决方法

起因&#xff1a;创建正常Android项目可以运行在真机设备上&#xff0c;创建flutter项目就找寻不到Android真机设备。 1&#xff1a;在flutter sdk安装目录按下Shift和鼠标右键&#xff0c;打开Powershell窗口 2&#xff1a;输入以下&#xff0c;然后回车 flutter config --…...

Vue 静态渲染 v-pre

v-pre 指令&#xff1a;用于阻止 Vue 解析这个标签&#xff0c;直接渲染到页面中。 语法格式&#xff1a; <div v-pre> {{ 数据 }} </div> 基础使用&#xff1a; <template><h3>静态渲染 v-pre</h3><p v-pre>静态渲染&#xff1a;{{ n…...

C语言基础概念考查备忘 - 标识符、关键字、预定义标识符、语法检查、语义检查 ... 左值、右值、对象、副作用、未定义行为、sizeof是什么等等

什么是标识符、关键字和预定义标识符&#xff1f;三者有何区别&#xff1f; 当谈论C语言中的标识符、关键字和预定义标识符时&#xff0c;让我们从每个概念的基础开始。 标识符&#xff08;Identifiers&#xff09;&#xff1a; 标识符是用来给变量、函数、类型等命名的。在…...

插件原理与开发

插件原理与开发 在 Mybatis总体执行流程 一文中简单的介绍了插件的初始化过程&#xff0c;本文将从源码的角度介绍一下mybatis的插件原理与简单开发实战。 插件原理 插件的注册和管理是通过InterceptorChain进行的&#xff0c;在创建Executor、StatementHandler、ParameterH…...

Git 分支合并时 Merge, Rebase, Squash 的使用场景

前言 Git 的分支设计大大提升了并行开发的能力&#xff0c;但相应的&#xff0c;也就要解决如何进行分支合并。毕竟分久必合&#xff0c;最终还是要把大家的工作合并起来&#xff0c;进行统一发布的。在合并时&#xff0c;通常有三种操作&#xff1a; Merge commitsRebaseSqu…...

第5节:Vue3 JavaScript 表达式

在 Vue3 中&#xff0c;JavaScript 表达式的使用方式与 Vue2 有所不同。 在 Vue3 中&#xff0c;你可以使用 v-bind 指令来绑定 JavaScript 表达式。例如&#xff1a; <template><div>{{ count }}</div> </template><script> import { ref } f…...

StarRocks 存算分离最佳实践,让降本增效更简单

StarRocks 存算分离自版本 3.0.0 开放使用&#xff0c;已经历过多个大版本迭代&#xff0c;在众多客户生产环境中得到验证。但在用户使用过程中也反馈了一些问题&#xff0c;大多源自对新能力不够熟悉导致无法达到最佳效果。因而&#xff0c;本文提供 StarRocks 存算分离最佳实…...

虚拟网络技术:bond技术

网卡bond也称为网卡捆绑&#xff0c;就是将两个或者更多的物理网卡绑定成一个虚拟网卡。 bond的作用&#xff1a; 1.提高网卡的吞吐量 2.增加网络的高可用&#xff0c;实现负载均衡。 一、bond简介 bond技术即bonding&#xff0c;能将多块物理网卡绑定到一块虚拟网卡上&…...

【Android】解决安卓中并不存在ActivityMainBinding

安卓中并不存在ActivityMainBinding这个类&#xff0c;这个类是在XML布局的最外层加入就会自动生成。但是你在最后绑定主布局时会报错获取不到根节点getRoot(). 最好的办法就是&#xff0c;删除原来的最外层节点&#xff0c;再重新添加&#xff0c;感觉是因为复制时并没有让系…...

mysql的几种索引

mysql索引的介绍可以mysql官网的词汇表中搜索&#xff1a; https://dev.mysql.com/doc/refman/8.0/en/glossary.html mysql可以在表的一列、或者多列上创建索引&#xff0c;索引的类型可以选择&#xff0c;如下&#xff1a; 普通索引&#xff08;KEY&#xff09; 普通索引可…...

R语言手册30分钟上手

文章目录 1. 环境&安装1.1. rstudio保存工作空间 2. 创建数据集2.1. 数据集概念2.2. 向量、矩阵2.3. 数据框2.3.1. 创建数据框2.3.2. 创建新变量2.3.3. 变量的重编码2.3.4. 列重命名2.3.5. 缺失值2.3.6. 日期值2.3.7. 数据框排序2.3.8. 数据框合并(合并沪深300和中证500收盘…...

前缀和例题:子矩阵的和AcWing796-Java版

//前缀和模板提,在读入数据的时候就可以先算好前缀和的大小 //计算前缀的时候用:g[i][j] g[i][j-1] g[i-1][j] - g[i-1][j-1] Integer.parseInt(init[j-1]); //计算结果的时候用:g[x2][y2] - g[x1 - 1][y2]- g[x2][y1-1] g[x1 -1][y1 - 1] "\n" //一些重复加的地…...

前端传参中带有特殊符号导致后端接收时乱码或转码失败的解决方案

文章目录 bug背景解决思路1&#xff1a;解决思路2解决思路3&#xff08;最终解决方案&#xff09;后记 bug背景 项目中采用富文本编辑器后传参引起的bug&#xff0c;起因如下&#xff1a; 数据库中存入的数据会变成这种未经转码的URL编码 解决思路1&#xff1a; 使用JSON方…...

【扩散模型】深入理解图像的表示原理:从像素到张量

【扩散模型】深入理解图像的表示原理&#xff1a;从像素到张量 在深度学习中&#xff0c;图像是重要的数据源之一&#xff0c;而图像的表示方式对于算法的理解和处理至关重要。本文将带你深入探讨图像的底层表示原理&#xff0c;从像素到张量&#xff0c;让你对图像表示有更清…...

WPS论文写作——公式和公式序号格式化

首先新建一个表格&#xff0c;表格尺寸按你的需求来确定&#xff0c;直接 插入--》表格 即可。 然后在表格对应位置填上公式&#xff08;公式要用公式编辑器&#xff09;和公式序号&#xff0c;然后可以按照单独的单元格或者整行或整列等来设置样式&#xff0c;比如居中对齐、…...

ChatGPT一周年,奥特曼官宣 OpenAI 新动作!

大家好&#xff0c;我是二狗。 今天是11月30日&#xff0c;一转眼&#xff0c;ChatGPT 发布已经一周年了&#xff01; 而就在刚刚&#xff0c;ChatGPT一周年之际。 OpenAI 正式宣布Sam Altman回归重任CEO, Mira Murati 重任CTO&#xff0c;Greg Brockman重任总裁&#xff0c;O…...

JVM 运行时内存篇

面试题&#xff1a; 讲一下为什么JVM要分为堆、方法区等&#xff1f;原理是什么&#xff1f;&#xff08;UC、智联&#xff09; JVM的分区了解吗&#xff0c;内存溢出发生在哪个位置 &#xff08;亚信、BOSS&#xff09; 简述各个版本内存区域的变化&#xff1…...

Docker安装postgres最新版

1. postgres数据库 PostgreSQL是一种开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它是一种高度可扩展的、可靠的、功能丰富的数据库系统。以下是关于PostgreSQL的一些介绍&#xff1a; 开源性&#xff1a;PostgreSQL是一个开源项目&#xff0c;可以…...

浅析计算机网络安全的的防范与措施

摘 要 随着信息和通讯的高速发展使得人们对计算机的依赖逐渐增强&#xff0c;生活与工作当中计算机都担任着那个不可或缺的角色&#xff0c;已经是人们生活当中的一部分&#xff0c;充分影响着我们生活和工作中的很多关键点&#xff0c;但计算机过多地在工作和生活中使用也带来…...

多表操作、其他字段和字段参数、django与ajax(回顾)

多表操作 1 基于对象的跨表查 子查询----》执行了两句sql&#xff0c;没有连表操作 2 基于双下滑线的连表查 一次查询&#xff0c;连表操作 3 正向和反向 放在ForeignKey,OneToOneField,ManyToManyField的-related_namebooks&#xff1a;双下滑线连表查询&#xff0c;反向…...

您知道计算机是怎么分类的嘛

地表最强计算机 第 61 版全球最强大的超级计算机已经发布。名为 Top500&#xff0c;顾名思义&#xff0c;该列表列出了全球 500 台最强大的超级计算机。榜单显示&#xff0c;美国的AMD、英特尔和IBM处理器是超级计算系统的首选。在 TOP10 中&#xff0c;有四个系统使用 AMD 处理…...

[MTK]安卓8 ADB执行ota升级

需求 adb 推送update.zip进行安卓的OTA升级 环境 平台:mtk SDK:Android 8 命令方式 需要root adb root adb remount adb push update.zip /data/media/0/ adb shell uncrypt /data/media/0/update.zip /cache/recovery/block.map adb shell echo /data/media/0/update.zi…...

python-比较Excel两列数据,并分别显示差异

利用 openpyxl 模块&#xff0c;操作Excel&#xff0c;比较Excel两列数据&#xff0c;并分别显示差异 表格数据样例如下图 A&#xff0c;B两列是需要进行比较的数据&#xff08;数据源为某网站公开数据&#xff09;&#xff1b;C&#xff0c;D两列是比较结果的输出列 A&#…...

RT-DETR手把手教程:NEU-DET钢材表面缺陷检测任务 | 不同网络位置加入EMA注意力进行魔改

💡💡💡本文独家改进:本文首先复现了将EMA引入到RT-DETR中,并跟不同模块进行结合创新;1)多种Rep C3结合;2)直接作为注意力机制放在网络不同位置; NEU-DET钢材表面缺陷检测: 原始 rtdetr-r18 map0.5为0.67 rtdetr-r18-EMA_attention map0.5为0.691 rtdetr-r18-…...

WebGL笔记:矩阵缩放的数学原理和实现

矩阵缩放的数学原理 和平移一样&#xff0c;以同样的原理&#xff0c;也可以理解缩放矩阵让向量OA基于原点进行缩放 x方向上缩放&#xff1a;sxy方向上缩放&#xff1a;syz方向上缩放&#xff1a;sz 最终得到向量OB 矩阵缩放的应用 比如我要让顶点在x轴向缩放2&#xff0c;y轴…...

处理器中的TrustZone之安全状态

在这篇博客中&#xff0c;我们将讨论处理器内对TrustZone的支持。其他部分则涵盖了在内存系统中的支持&#xff0c;以及建立在处理器和内存系统支持基础上的软件情况。 3.1 安全状态 在Arm架构中&#xff0c;有两个安全状态&#xff1a;安全状态和非安全状态。这些安全状态映射…...

开发一款短剧视频小程序软件多少钱?

今年最炙手可热的互联网项目之一当属短剧小程序&#xff0c;常常受到客户的咨询&#xff0c;他们想了解开发一套短剧小程序需要多少费用。今天&#xff0c;我将详细介绍相关费用及开发细节。 小程序认证费用&#xff1a; 每年300元&#xff0c;是确保小程序正常运营所必需的认证…...

『PyTorch学习笔记』分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行

分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行 文章目录 一. 介绍二. 并行数据加载2.1. 加载数据步骤2.2. PyTorch 1.0 中的数据加载器(Dataloader) 三. 数据并行3.1. DP(DataParallel)的基本原理3.1.1. 从流程上理解3.1.2. 从模式角度理解3.1.3. 从操作系统角度看3.1.…...

揭秘C语言结构体:通往内存对齐的视觉之旅

揭秘C语言结构体&#xff1a;通往内存对齐的视觉之旅 引言 在C语言的编程旅程中&#xff0c;结构体&#xff08;structs&#xff09;是一个关键而强大的概念。结构体不仅允许我们组织和存储不同类型的数据&#xff0c;而且通过深入了解内存对齐&#xff0c;我们可以更好地优化…...

java中可重入锁的作用是什么?

可重入锁的主要作用是允许同一个线程在持有锁的情况下多次进入同步代码块或方法&#xff0c;而不会被阻塞。这样做的主要目的是为了简化编程模型&#xff0c;增强程序的灵活性&#xff0c;并避免死锁的发生。 1. 简化编程模型&#xff1a; 可重入锁使得同一个线程在执行临界区…...

适合炎热天气的最佳葡萄酒有哪些?

每年的夏天&#xff0c;白葡萄酒和玫瑰红葡萄酒总会是葡萄酒爱好者的首选&#xff0c;这是为什么呢&#xff1f;随着春天的逝去&#xff0c;夏天悄悄地到来&#xff0c;空气变得炎热和沉重&#xff0c;树木变得越来越郁郁葱葱&#xff0c;白天的时间更长而晴朗了。多雨的五月变…...