【嵌入式开发】使用Linux系统调用编程练习
一、进程和线程的概念及基础用法
在Linux系统中,进程(Process)和线程(Thread)是操作系统进行任务调度的基本单位,它们既有联系又有区别。
1.1 进程和线程介绍
1.1.1 进程(Process)
定义:
进程是程序的一次执行实例,是操作系统资源分配的基本单位。每个进程拥有独立的地址空间、文件描述符、环境变量等资源。
特点:
(1)独立性:进程之间相互隔离,一个进程崩溃通常不会直接影响其他进程(通过进程间通信(IPC)才能交互)。
(2)资源开销大:创建、销毁或切换进程时,需要分配或回收内存、文件句柄等资源,成本较高。
(3)上下文切换:进程切换需要保存和恢复完整的运行环境(如寄存器、内存映射等),速度较慢。
Linux实现:
(1)通过 fork() 系统调用创建子进程(写时复制技术优化性能)。
(2)进程描述符为 task_struct(内核数据结构),所有进程通过树形结构组织( init 进程为根)。
1.1.2 线程(Thread)
定义:
线程是进程内的执行单元,是CPU调度的基本单位。同一进程的多个线程**共享进程的资源**(如内存、文件描述符),但拥有独立的栈和寄存器。
特点:
(1)轻量级:创建、切换线程的开销远小于进程,因为无需分配新地址空间或资源。
(2)共享资源:线程间可直接访问共享数据(需同步机制如互斥锁避免竞态条件)。
(3)协作性:一个线程崩溃可能导致整个进程终止(共享同一地址空间)。
Linux实现:
(1)线程通过 pthread_create()(POSIX线程库)创建,内核视角中线程被称为轻量级进程(LWP)。
(2)线程与进程使用相同的`task_struct`描述符,通过共享资源(如`mm_struct`内存描述符)区分。
1.1.3 进程 vs 线程(关键区别)
特性 | 进程 | 线程 |
---|---|---|
资源分配 | 独立地址空间和系统资源 | 共享进程资源 |
创建/切换开销 | 高 | 低 |
通信方式 | IPC(管道、信号、共享内存等) | 直接读写共享变量(需同步) |
健壮性 | 一个进程崩溃不影响其他进程 | 一个线程崩溃可能导致进程终止 |
并发性 | 多进程可跨CPU核心并行 | 多线程可并行(同一进程内) |
1.1.4 Linux的独特实现
线程与进程的统一:
Linux内核不严格区分线程和进程,线程被视为共享资源的进程(通过clone()系统调用指定共享级别,如CLONE_VM共享地址空间)。
调度方式:
线程和进程均由内核调度器统一调度(Linux线程是内核线程,而非用户态线程)。
查看命令:
ps -ef:查看进程列表。
ps -eLf:查看进程及其线程(LWP列显示线程ID)。
top -H:显示线程级别的CPU占用。
1.2 基础用法练习
1.2.1 查看系统中各进程的编号pid
在Linux系统中,PID(Process ID/进程ID)是操作系统分配给每个运行进程的唯一数字标识符。
通过以下命令可以查看系统中各进程的编号pid:
ps -a
显示的进程编号
其中PID是进程的唯一标识符,比如2150507是ps的进程ID;TTY是进程关联的终端;CMD是进程对应的命令。
1.2.2 终止一个进程pid
终止进程是操作系统提供的“紧急制动”机制,本质是在资源有限、程序不完美的现实条件下,保障系统可控性的必要手段。合理使用终止操作是Linux系统管理的基本技能。
方式如下(优先SIGTERM,慎用SIGKILL):<PID>
信号 | 作用 | 使用场景 |
---|---|---|
SIGTERM (15) | 请求进程正常退出(允许清理) | 优雅关闭服务( kill <PID>) |
SIGKILL (9) | 强制立即终止(不可捕获或忽略) | 进程无响应时(kill -9 <PID>) |
首先创建一个用于测试的进程:
sleep 100 &
使用ps -a再次查看系统进程:
可以看到成功添加测试进程
通过以下命令终止一个进程pid:
测试进程已终止
二、Linux的虚拟内存管理/stm32的真实物理内存(内存映射)
2.1 Linux的虚拟内存管理
核心概念:
- 虚拟内存(Virtual Memory):
(1)每个进程拥有独立的虚拟地址空间(32位系统通常为4GB,64位系统更大),与物理内存分离。
(2)由MMU(Memory Management Unit)负责虚拟地址到物理地址的转换(页表映射)。
(3)支持分页(Paging)机制,内存按固定大小(如4KB)划分管理。
- 核心机制:
(1)地址转换:CPU访问虚拟地址 → MMU查询页表 → 映射到物理内存或磁盘(Swap)。
(2)内存保护:不同进程的虚拟空间隔离,防止非法访问。
(3)按需分配:物理内存仅在访问时分配(如 malloc() 申请内存后,实际使用时触发缺页异常)。
(4)Swap交换:当物理内存不足时,将不活跃的页面换出到磁盘。
优势:
(1)进程隔离:防止进程间内存冲突。
(2)大地址空间:程序可使用的内存远超物理内存大小(依赖Swap)。
(3)内存共享:动态库、文件映射(mmap)等可共享同一物理内存。
(4)安全性:通过权限位(读/写/执行)控制内存访问。
典型场景:
// Linux 程序申请内存(虚拟内存)
char *buf = malloc(1GB); // 仅分配虚拟地址,物理内存尚未占用
buf[0] = 'A'; // 触发缺页异常,分配物理页
2.2 STM32 真实物理内存(内存映射)
核心概念:
- 物理内存直接访问:
(1)STM32(Cortex-M系列)通常无MMU,CPU直接访问物理地址。
(2)内存划分由链接脚本(.ld文件)静态定义(如Flash、SRAM、外设寄存器区域)。
(3)外设寄存器通过内存映射I/O(Memory-Mapped I/O, MMIO)访问。
- 关键特点:
(1)无虚拟地址:所有地址均为物理地址(如SRAM地址 0x20000000)。
(2)静态分配:编译时确定变量和代码的内存位置(无运行时动态映射)。
(3)无内存保护:错误访问(如越界)直接导致硬件错误(HardFault)。
(4)无Swap:物理内存大小即极限(无法扩展)。
内存布局示例(Cortex-M):
地址范围 | 用途 |
---|---|
0x00000000 | Flash(程序代码) |
0x20000000 | SRAM(运行时数据) |
0x40000000 | 外设寄存器(GPIO、UART等) |
典型场景:
// STM32 直接操作物理地址
volatile uint32_t *gpio_a = (uint32_t*)0x40020000; // GPIOA寄存器地址
*gpio_a |= 0x01; // 直接写物理内存(控制外设)
2.3 主要区别对比
特性 | Linux虚拟内存 | STM32物理内存 |
---|---|---|
地址空间 | 虚拟地址(MMU转换) | 物理地址(直接访问) |
内存管理 | 动态分页、Swap | 静态分配(链接脚本定义) |
隔离性 | 进程间隔离(安全性高) | 无隔离(直接操作硬件) |
外设访问 | 通过设备驱动(/dev 或mmap ) | 直接MMIO(操作寄存器) |
动态内存分配 | 支持(malloc /free ) | 需手动管理(如静态数组或堆分配) |
适用场景 | 通用计算(多任务、复杂OS) | 实时嵌入式系统(低延迟、确定性) |
2.4 关键差异分析
(1) 灵活性 vs 确定性
Linux:
1)灵活性强,适合多任务、复杂应用。
2)但地址转换和缺页处理引入不确定性(不适合硬实时系统)。
STM32:
1)无MMU开销,访问延迟确定(适合实时控制)。
2)但需开发者手动管理内存,易出错(如栈溢出直接崩溃)。
(2) 内存扩展能力
Linux:通过Swap扩展可用内存(牺牲性能)。
STM32:物理内存固定(如64KB SRAM),无法扩展。
(3) 外设访问方式
Linux:外设需通过内核驱动(如 write()操作设备文件)。
STM32:直接读写寄存器(如 GPIOA = 1),效率极高。
2.5 总结
Linux虚拟内存:面向通用计算,提供隔离性、安全性和大内存支持,但牺牲实时性。需要多任务、安全隔离时进行选择。
STM32物理内存:为实时嵌入式设计,直接操作硬件,高效但缺乏保护机制。需要低延迟、确定性控制时进行选择。
三、 Linux系统调用函数练习---fork()、wait()、exec()
3.1 三种函数介绍
在 Linux 系统中,fork()、wait() 和 exec() 是进程管理的核心函数,用于创建新进程、控制进程执行和进程间同步。
3.1.1 fork() - 创建子进程
功能:
(1)复制当前进程,创建一个几乎完全相同的子进程。
(2)子进程获得父进程的代码段、数据段、堆栈、文件描述符等副本(采用写时复制(Copy-On-Write, COW)优化,初始时共享内存,只有修改时才真正复制)。
(3)调用一次,返回两次:
- 父进程返回 子进程的 PID(>0)。
- 子进程返回 0(若失败返回 -1)。
3.1.2 exec() - 替换进程映像
功能:
(1)替换当前进程的代码和数据,加载并执行一个新程序(如 /bin/ls)。
(2)调用成功后,原进程的代码不再执行,被新程序完全替代。
(3)若失败则返回 -1(原进程继续执行)。
常见函数族:
函数 | 特点 |
---|---|
execl() | 参数列表(可变参数) |
execv() | 参数数组(char *argv[] ) |
execle() | 可指定环境变量 |
execvp() | 自动从 PATH 查找程序 |
3.1.3 wait() - 等待子进程结束
功能:
(1)父进程阻塞等待子进程终止,并回收其资源(避免僵尸进程)。
(2)获取子进程退出状态(通过 status 参数)。
(3)若没有子进程,则立即返回 -1。
常见函数:
函数 | 特点 |
---|---|
wait(int *status) | 等待任意子进程结束 |
waitpid(pid_t pid, int *status, int options) | 等待指定子进程,支持非阻塞 |
3.2 函数调用练习
3.2.1 Xterminal
使用命令创建homework文件夹:
mkdir ~/homework && cd ~/homework
在homework文件夹中使用 vi 命令编辑一个c代码:
vi syscall_example.c
测试代码如下,在命令行输入 :wq 保存代码文件并退出:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>int main() {pid_t pid = fork(); // 创建子进程if (pid < 0) {perror("fork failed");return 1;} else if (pid == 0) {// 子进程:替换为 ls -l 命令printf("Child process (PID=%d) is running 'ls -l'...\n", getpid());execl("/bin/ls", "ls", "-l", NULL); // 调用 execperror("exec failed"); // 只有 exec 失败时才会执行return 1;} else {// 父进程:等待子进程结束printf("Parent process (PID=%d) waiting for child...\n", getpid());int status;wait(&status); // 等待子进程if (WIFEXITED(status)) {printf("Child exited with code %d\n", WEXITSTATUS(status));}}return 0;
}
关键步骤解析(三种函数结合):
fork():父进程继续执行 else 分支,子进程执行 if (pid == 0) 分支。
exec():子进程调用 execl() 替换为 ls -l 命令,原代码不再执行。
wait():父进程阻塞,直到子进程结束,并通过 WEXITSTATUS 获取退出码(0 表示成功)。
在终端界面使用gcc编译代码:
gcc syscall_example.c -o syscall_example
运行程序:
./syscall_example
结果展示:
3.2.2 树莓派
步骤与Xterminal一致,但是这里使用nano命令进行c文件编辑,因为树莓派默认安装了nano:
结果展示:
四、心得体会及参考资料
通过本次在Xterminal以及树莓派上实践Linux系统调用fork()、wait()、exec()等函数,我深入理解了多进程管理的核心机制。fork()创建子进程的一次调用两次返回特性、exec()替换进程映像的彻底性,以及wait()对资源回收的关键作用。在调试过程中,通过strace跟踪系统调用和perror定位错误,我掌握了排查系统调用问题的实用技巧,同时体会到树莓派这类嵌入式设备与通用计算机在系统设计上的异同。这次实验不仅验证了理论知识,更让我获得了在Linux环境下进行多进程编程的宝贵实践经验,为后续学习进程通信和并发控制奠定了坚实基础。
参考资料:
https://zhuanlan.zhihu.com/p/511801984
https://zhuanlan.zhihu.com/p/559212633
Linux 系统编程:从入门到进阶,从零基础到精通,收藏这篇就够了!_系统编程入门-CSDN博客
相关文章:
【嵌入式开发】使用Linux系统调用编程练习
一、进程和线程的概念及基础用法 在Linux系统中,进程(Process)和线程(Thread)是操作系统进行任务调度的基本单位,它们既有联系又有区别。 1.1 进程和线程介绍 1.1.1 进程(Process)…...
React框架的Concurrent Mode
以下是关于 Concurrent Mode 的系统梳理: 一、Concurrent Mode 的诞生背景 传统渲染的局限性 同步阻塞:React 15 的 Stack Reconciler 无法中断渲染流程优先级缺失:用户交互与后台任务同等对待资源竞争:网络请求与渲染任务无法智能调度核心设计目标 可中断渲染:允许高优先…...
ER-图,详情和画法
一、E-R图的核心元素 1.实体 表示现实中对象或概念,用矩形表示 示例:用户、老师、学生 2.属性 描述实体的特征,用椭圆表示。 分为主键(用户id) 和非主键(用户昵称) 3.关系 表示实体间的…...
深度学习图像分类数据集—十种西红柿病态叶识别分类
该数据集为图像分类数据集,适用于ResNet、VGG等卷积神经网络,SENet、CBAM等注意力机制相关算法,Vision Transformer等Transformer相关算法。 数据集信息介绍:10种西红柿病态叶识别分类:Bacterial_spot,Earl…...
【Flask开发】嘿马文学web完整flask项目第3篇:2.用户认证,2.用户认证【附代码文档】
教程总体简介:2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…...
基于Pyhon的京东笔记本电脑数据可视化分析系统
【Python】基于Pyhon的京东笔记本电脑数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python语言开发,通过Flask框架与Bootstrap的结合,实…...
『不废话』之Llama 4实测小报
2025年4月5日Llama 4一开源,随后OpenRouter等平台就提供免费调用。对于中文社区来,官方的测评结果其实意义不大(原因先按下不表),就看知乎、微博、B站、twitter上的真实感受,最重要的是自己的真实案例测评。…...
llama.cpp 和 vLLM 的详细对比分析
llama.cpp 和 vLLM 的详细对比分析,基于最新技术动态(2025年4月)整理: 1. 核心定位 维度llama.cppvLLM设计目标轻量化边缘计算,突破硬件限制(如手机/树莓派)企业级高性能推理,优化G…...
Windows 操作系统使用vscode 配置GTK4
本篇教程,主要介绍在vscode中如何配置使用GTK4,并运行一个简易的入门案例。 一、程序代码 1、demo.cpp #include <gtk/gtk.h>// 定义一个回调函数,用于处理按钮点击事件 static void on_button_clicked(GtkButton *button...
swift-汇编分析多态原理、init
一、结构体和类的本质区别 结构体 编译完就知道调用谁 类 (类似c 的虚函数表) 12 直接将对象将来要调用的函数内存地址提前放进类型信息里面,这些类型信息编译完就确定你将来要调用谁,运行过程过程中就去那块内存里面找 方法的存…...
Docker基础2
如需转载,标记出处 本次我们将下载一个 Docker 镜像,从镜像中启动容器 上一章,安装 Docker 时,获得两个主要组件: Docker 客户端 Docker 守护进程(有时称为“服务器”或“引擎”) 守护进程实…...
labelme json 标签转yolo txt【记录】
01 labelme json 转 txt(w_convert_labelme_to_yolo.py) #WT 将labelme json标签格式转换为YOLO txt格式 # 导入所需模块 import cv2 # OpenCV用于图像处理 import os # 操作系统路径管理 import json # JSON文件解析 import glob # 文件通配符搜索…...
Java 集合框架与 Stream 流深入剖析(重点详细讲解)
目录 引言 一、ArrayList 1. 概述 2. 特点 动态扩容 初始容量 扩容倍数 随机访问高效 插入和删除效率低 3. 代码示例 4. 分析 二、HashSet 1. 概述 2. 特点 唯一性 插入、删除和查找效率高 无序性 3. 代码示例 4. 分析 三、HashMap 1. 概述 2. 特点 键唯…...
实操(多线程特点、健壮性降低、缺乏访问控制)Linux
线程 创建两个线程 makefile(添加原生线程库) mythread:thread.ccg -o $ $^ -stdc11 -lpthread .PHONY:clean clean:rm -f mythreadthread.cc #include <iostream> #include <pthread.h> #include<unistd.h>using namespace std;…...
微信小程序学习实录12:掌握大数据量轨迹展示的MySQL结构设计
获取经纬度信息后,mysql建立数据表po_trajectory,字段包含tra_id、longitude、latitude、tra_time和openid。 为微信小程序创建的 po_trajectory 数据表,字段包含 tra_id、longitude、latitude、tra_time 和 openid,从结构设计上…...
语法: result=ldexp (value, exp);
LDEXP( ) 语法: resultldexp (value, exp); 参数: value是一个浮点数; exp是一个有符号的整型数; 返回值: result同value保持一致,是一个浮点数,结果是value乘以2的exp次方. 功能: ldexp( ) 该函数是用一个浮点数乘以2的多少(整数)次方. 有效性: 适合所有的CPU设备…...
STM32学习之硬件FPU(原理篇)
📢:如果你也对机器人、人工智能感兴趣,看来我们志同道合✨ 📢:不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸对你有帮助,可点赞 👍…...
QEMU源码全解析 —— 块设备虚拟化(15)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(14) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 特此致谢! QEMU初始化阶段的块设备虚拟化 本回解析virtio_blk_device_realize函数中的virtio_a…...
Web3(阶段一:入门)——哈希算法
一、简述 哈希算法(Hash Algorithm)是一种将任意长度的输入数据转换为固定长度输出(哈希值)的数学函数。其核心作用是通过不可逆的计算生成唯一标识数据的 “数字指纹”,广泛应用于数据完整性验证、密码学、区块链等领…...
高频面试题(含笔试高频算法整理)基本总结回顾63
干货分享,感谢您的阅读! (暂存篇---后续会删除,完整版和持续更新见高频面试题基本总结回顾(含笔试高频算法整理)) 备注:引用请标注出处,同时存在的问题请在相关博客留言…...
如何深入理解C#中的备忘录模式(Memento Pattern)设计模式
在软件开发中,设计模式是一种解决特定问题的通用方法,而备忘录模式(Memento Pattern)是其中一种用于保存对象状态的结构型设计模式。它允许你在不暴露对象内部结构的情况下,保存和恢复对象的状态。本文将深入探讨C#中的…...
存储引擎 / 事务 / 索引
1. 存储引擎 MySQL 中特有的术语。 (Oracle 有,但不叫这个名字) 是一种表存储 / 组织数据的方式 不同的存储引擎,表存储数据的方式不同 1.1 查看存储引擎 命令: show engines \g(或大写:G…...
药店管理系统
https://download.csdn.net/download/weixin_57836618/90572873 软件架构 Java SpringBoot Mybatis/Mybatis-plus Mysql 项目功能说明 促销管理:零售出库、零售退货采购管理:采购订单、采购入库、采购退货销售管理:销售订单、物流信息、…...
Kafka 的发展历程
Kafka 作为一个高性能的分布式消息流平台,从诞生到现在已经有了长足的发展,经历了多个版本的迭代。下面是 Kafka 的 发展历史、版本迭代 以及 新特性 的概述。 1. Kafka 的诞生与早期发展 2010年:Kafka 由 LinkedIn 的工程师 Jay Kreps、Ne…...
PowerBI 之DAX 3:文本、信息、财务、时间智能函数
文章目录 一、文本函数1.1 FORMAT函数1.1.1 数字格式1.1.2 日期/时间格式1.1.3 自定义格式 1.2 CONCATENATE与CONCATENATEX1.2.1 返回多个类别名称1.2.2 返回多个类别的名称和数据,并排序 1.3 使用SEARCH进行模糊查找 二、信息函数2.1 ISINSCOPE 三、财务函数3.1 PV…...
GESP C++三级 知识点讲解
C编程三级标准 (一)知识点详述 (1)了解二进制数据编码:原码、反码、补码。 (2)掌握数据的进制转换:二进制、八进制、十进制、十六进制。 (3)掌握位运算:与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)的基本使用方法及原理。 (4)了解算法的概念与描述&…...
如何访问和使用Sora:OpenAI视频生成模型的完整指南
OpenAI的Sora作为革命性的视频生成模型,能够根据文本提示创建长达60秒的高质量视频内容。本教程将详细介绍目前Sora的使用方法和访问途径。 一、Sora当前访问状态(2024年3月更新) 目前Sora仍处于有限访问阶段,OpenAI采取了分阶段…...
MyBatis 分页插件使用教程
MyBatis 分页插件使用教程 MyBatis 是一款优秀的持久层框架,但原生的 MyBatis 并不支持分页查询。为了简化分页操作,MyBatis 官方和第三方提供了多种分页插件,最常用的就是 MyBatis-Plus 的分页插件。本文详细介绍 MyBatis-Plus 分页插件的使…...
OpenDriveVLA:通过大型视觉-语言-动作模型实现端到端自动驾驶
25年3月来自慕尼黑工大和慕尼黑大学的论文“OpenDriveVLA: Towards End-to-end Autonomous Driving with Large Vision Language Action Model”。 OpenDriveVLA,一种专为端到端自动驾驶而设计的视觉-语言-动作 (VLA) 模型。OpenDriveVLA 以开源预训练大型视觉-语言…...
深入探究C++ 运算符重载:以日期类为例
目录 前言 一、运算符重载基础 1.1 运算符重载原理 1.2 示例代码 二、赋值运算符重载 2.1 赋值运算符重载格式 2.2 代码实现 2.3 注意事项 三、前置和后置重载 3.1 前置重载 3.2 后置重载 四、日期类的完整实现 4.1 获取某月天数 4.2 完整类定义 五、总结 前言 …...
2024第十五届蓝桥杯大赛软件赛省赛Java大学B组 报数游戏 类斐波那契循环数 分布式队列 食堂 最优分组 星际旅行 LITS游戏 拼十字
目录 A 报数游戏 B 类斐波那契循环数 C 分布式队列 D 食堂 E 最优分组 F 星际旅行 G LITS 游戏 H 拼十字 今天心血来潮把去年的题目又做了一遍... 本人去年大一 拿的是全省第五进的国赛 而如今的已经是一名 codeforces 1500 分的入门级别的算竞选手了 下周又是蓝桥杯…...
4月6日随笔
一觉起来十点多 其实六点和九点分别醒过一次。 起来之后点了个侍卫草推荐的猪排饭,真的巨好吃,猪排很脆,溏心蛋也很香 但是因为酒店十二点半要退房,就匆匆吃完了猪排和一半米饭就走了 今天下午在科技楼写了一会作业,…...
[GN] sigrokdecode 模块学习指南 --- 准备阶段
系列文章目录 文章目录 系列文章目录前言指南libsigrokdecode 学习一、构建环境安装libsigrokdecode安装 sigrok-cli(命令行工具)安装 PulseView(图形界面)关联 libsigrokdecode完整验证参数解释 二、BUG解决1. 确保编译时启用了 …...
【力扣hot100题】(056)电话号码的字母组合
依旧是很经典的回溯。 记得当初做这题想了半天电话号码怎么存储,用哈希表就可以解决。 class Solution { public:vector<string> result;string digits;int loc0;unordered_map<char,string> dictionary{{2,"abc"},{3,"def"},{4,…...
kotlin,数字滚动选择
用国内的通义灵码和codegeex都没有弄出来,最后只得用墙外的chatgpt才弄出一个满意的。kotlin真的有点难,好在有AI,让学习没这难了。 package com.example.mynumsetimport android.os.Bundle import androidx.activity.ComponentActivity imp…...
Flask学习笔记 - 数据库
Flask 数据库操作 Flask 提供了多种方式来与数据库进行交互,包括直接使用 SQL 和利用 ORM(对象关系映射)工具,如 SQLAlchemy。 使用SQLAlchemy创建和管理数据库:使用 db.create_all() 创建表。CRUD 操作:…...
学透Spring Boot — 015. 自废武功——关闭自动配置
这是我的《学透Spring Boot》专栏的第15篇文章,了解更多请移步我的专栏:CSDN Postnull的专栏《学透Spring Boot》 目录 遇到的问题 分析日志 自动配置的过程 解决报错 方法1:添加数据库配置 方法2:关闭JPA自动配置 总结 遇…...
DeepSeek本地部署(Ollama)
1. Ollama 安装 Ollama 官网地址: https://ollama.com/安装包网盘地址: https://pan.baidu.com 2. Deepseek 部署 根据自己电脑配置和应用需求选择不同模型,配置不足会导致运行时候卡顿。 版本安装指令模型大小硬盘(存储)显卡…...
Python如何将已经安装的包导出为 .whl 文件以便离线使用
1、确认已安装的依赖包 pip list --formatfreeze > requirements.txt2、下载但不安装依赖包 # 单个包使用 pip download 依赖包名称 -d ./offline_packages# 多个包使用 pip download -r requirements.txt -d ./offline_packages使用离线包的时候,还需要确保在与…...
TypeScript学习第十六篇 - interface和type的区别?
在 TypeScript 中,interface 和 type 都用于定义自定义类型,但它们有一些关键区别: 1. 主要区别 1.1. 语法差异 interface 使用 interface 关键字。 interface Person {name: string;age: number; } type 使用 type 关键字。 type Pers…...
vue-axios跨域问题
vue-axios跨域问题 跨域原因现象前端解决方案 跨域原因 跨域:浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。 在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域…...
PyCharm中虚拟环境.venv搭建详解
PyCharm中创建、配置和管理虚拟环境,可以确保每个项目都有独立的依赖项,从而提高开发效率和项目的可移植性。接下来介绍一下pycharm虚拟环境的目录介绍以及搭建和管理办法。 虚拟环境目录是PyCharm中用于存储虚拟环境相关文件和配置的文件夹。PyCharm虚…...
小刚说C语言刷题——第16讲 switch语句
在日常生活中,我们经常会遇到多分支的情况。当分支较多时,我们可以用嵌套的if-else语句。但是这样会让结构显得混乱。这个时候我们可以考虑用switch语句。 1.语法格式 switch (表达式) { case 常量表达式1: 语句1; break; case 常量表达式…...
关联容器-模板类pair数对
关联容器 关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。 关联容器支持高效的关键字查找和访问。 两个主要的关联容器(associative-container),set和map。 set 中每个元素只包…...
Linux:基础IO---inode
文章目录 1. inode1.1 未被打开的文件1.2 认识硬件1.3 对磁盘进行逻辑抽象(解构)1.4 文件系统 序:在上一个章节缓冲区中,我通过将几个实例进行对比,引出了C语言级别即用户级别的缓冲区的概念,将用户级缓冲与…...
蓝桥杯_LITS游戏 俄罗斯方块 模拟 暴力 搜索 DFS 剪纸 枚举
从格子图的第一个格子开始,依次尝试放置 L、I、T、S 形状。在放置每个形状时,检查当前位置是否合法(是否在格子图范围内且没有被其他形状占据)。如果合法,我们就标记当前位置为已占据,并递归地尝试放置下一…...
蓝桥杯基础算法-字符串与集合
对集合的考察集中在集合的特性和功能。 set-唯一性 list-有序性 集合元素的个数 思路分析:set的唯一性,取出重复的子串 eg: 下标0截取的范围:【0,最大下标】 下标1截取的范围:【1,最大下标…...
ChatGPT 4:解锁AI文案、绘画与视频创作新纪元
文章目录 一、ChatGPT 4的技术革新二、AI文案创作:精准生成与个性化定制三、AI绘画艺术:从文字到图像的神奇转化四、AI视频制作:自动化剪辑与创意实现五、知识库与ChatGPT 4的深度融合六、全新的变革和机遇《ChatGPT 4 应用详解:A…...
【C++】多态详解
文章目录 一、多态的概念二、多态的效果及实现1.多态的效果2.实现多态有两个必须条件3.虚函数4.虚函数的重写/覆盖5.多态场景下两个很坑的选择题6.重载/重写/隐藏的对比 三、虚函数重写的一些其他知识1.协变(了解)2.析构函数的重写3.检测是否重写&#x…...
Python与CATIA集成实现拓扑面颜色映射——图像驱动自动化设计实战
一、技术背景与需求场景 在汽车/航空等高端制造领域,常需将二维图像的颜色特征映射到三维模型的拓扑表面。传统手动操作耗时且易出错,本文通过Python-CATIA集成技术实现像素级颜色自动映射,可应用于: 涂装方案可视化验证材料纹理…...