【linux学习】linux系统调用编程
目录
一、任务、进程和线程
1.1任务
1.2进程
1.3线程
1.4线程和进程的关系
1.5 在linux系统下进程操作
二、Linux虚拟内存管理与stm32的真实物理内存区别
2.1 Linux虚拟内存管理
2.2 STM32的真实物理内存映射
2.3区别
三、 Linux系统调用函数 fork()、wait()、exec()
3.1 fork
3.2 wait
3.3 exec
四、在树莓派中,创建组员账号,完成练习
4.1 用户创建和配置:
4.2登录自己的树莓派账号练习
五、总结
一、任务、进程和线程
1.1任务
多任务系统指可以同一时间内运行多个应用程序的系统,每个应用程序被称作一个任务。
任务是一个逻辑概念,指由一个软件完成的任务,或者是一系列共同达到某一目的的操作。
任务的特点:
-
在实时操作系统(RTOS)中,任务通常是独立的、无法返回的函数。
-
任务的调度和管理依赖于任务控制块(TCB),它记录任务的状态、优先级等信息
1.2进程
进程是指一个具有独立功能的程序在某个数据集上的一次动态执行过程,它是系统进行资源分配和调度的最小单元。
通俗来说,进程就是程序的一次执行过程,程序是静态的,它作为系统中的一种资源是永远存在的。而进程是动态的,它是动态的产生,变化和消亡的,拥有其自己的生命周期。
举个例子:同时挂三个 QQ 号,它们就对应三个 QQ 进程,退出一个就会杀死一个对应的进程。但是,就算你把这三个 QQ 全都退出了,QQ 这个程序死亡了吗?显然没有。
进程不仅包含正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说 CPU、内存、网络资源等。很多小伙伴在回答进程的概念的时候,往往只会说它是一个运行的实体,而会忽略掉进程所占据的资源。比如说,同样一个程序,同一时刻被两次运行了,那么他们就是两个独立的进程。
-
特点:
-
每个进程拥有独立的内存空间,包括代码段、数据段、堆和栈。
-
进程之间相互隔离,一个进程的崩溃通常不会影响其他进程。
-
进程是资源分配的最小单位,但不是CPU调度的最小单位。
-
1.3线程
线程是进程内独立的一条运行路线,是处理器调度的最小单元,也可以称为轻量级进程。线程——程序执行的最小单位。
-
特点:
-
一个进程可以包含多个线程,线程共享所属进程的内存空间和资源。
-
线程的切换开销较小,因为它只需要切换寄存器状态和栈信息。
-
线程是程序执行的最小单位,多个线程可以并发执行。
-
1.4线程和进程的关系
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;
(2)资源分配给进程,同一进程内的所有线程共享该进程的所有资源;
(3)线程在执行过程中需要协作同步。不同进程中的线程之间要利用消息通信的方法实现同步;
(4)处理机分配给线程,即真正在处理机上运行的是线程;
(5)线程是进程的一个执行单元,也是进程内的可调用实体。
1.5 在linux系统下进程操作
操作:1) 用 ps -a 命令查看系统中各进程的编号pid ; 2) 用kill 命令终止一个进程pid。
ps -a
-
ps 是“process status”的缩写,用于显示当前系统中运行的进程信息。
-
选项
-a
:表示显示当前终端(TTY)中所有用户启动的进程。
我可以通过用一个sleep也来弄一个进程方便我们将他kill,如下操作:
sleep 50&
-
sleep
命令用于让当前进程暂停指定的时间(单位为秒)。这里让进程暂停50秒。 -
&
符号:将命令放到后台执行。这样,用户可以在命令执行的同时继续在终端中输入其他命令。
kill 1317303
-
向PID为
1317303
的sleep
进程发送终止信号,使其停止运行。 -
再次用ps -a查看是否终止进程。
-
二、Linux虚拟内存管理与stm32的真实物理内存区别
2.1 Linux虚拟内存管理
Linux操作系统采用虚拟内存管理技术,使得每个进程都有各自互不干涉的进程地址空间。
在Linux中,虚拟内存管理的基本理念是“每个程序认为它拥有独立的内存”。虚拟内存通过以下方式实现:
-
虚拟地址与物理地址:Linux使用虚拟地址来访问内存,这些虚拟地址通过内存管理单元(MMU)映射到物理地址。虚拟地址空间被分为用户空间和内核空间,每个进程都有自己的虚拟地址空间。
-
分页机制:Linux将内存划分为固定大小的页面(通常是4KB),并根据需要将页面从磁盘交换到物理内存中。这种机制允许系统运行比物理内存更大的程序。
-
内存保护与隔离:虚拟内存机制提供了内存保护,确保一个进程无法访问另一个进程的内存。内核空间的内存对用户空间进程不可见。
-
动态内存分配:Linux内核使用懒惰分配(Lazy Allocation)技术,只有当进程实际访问分配的内存时,才会分配物理内存。
-
交换空间(Swap):当物理内存不足时,Linux会将不常用的页面交换到磁盘上的交换空间。
用户感知:程序操作的是虚拟地址,物理地址对用户透明;通过malloc()
分配内存时,实际可能仅在虚拟地址空间预留范围(brk
或mmap
),直到访问时才触发缺页异常分配物理页。
2.2 STM32的真实物理内存映射
STM32是一种嵌入式微控制器,其内存管理相对简单,主要基于物理内存的直接访问。
-
物理内存映射:STM32使用物理内存映射,将内存和外设分配到不同的地址范围。这种映射是固定的,没有虚拟地址的概念。
-
内存保护缺失:STM32通常没有内存保护机制,用户空间代码可以直接访问内核空间的内存。这可能导致一个程序的错误操作影响整个系统。
-
简单的内存管理:STM32的内存管理主要依赖于静态分配,程序在启动时分配所需的内存,并在运行时直接访问这些内存。
-
无交换空间:STM32没有交换空间的概念,所有内存操作都直接在物理内存上进行。
开发模式:程序员需手动管理内存,避免溢出。外设操作通过指针直接访问寄存器,比如常见的:
// 直接操作STM32的GPIO寄存器
#define GPIOA_ODR (*(volatile uint32_t*)0x40020014)
GPIOA_ODR |= 0x00000001; // 设置PA0引脚为高电平
2.3区别
特性 | Linux虚拟内存 | STM32物理内存映射 |
---|---|---|
地址空间 | 虚拟地址(通过MMU转换) | 物理地址(直接访问) |
硬件依赖 | 必须支持MMU(如ARM Cortex-A系列) | 无MMU(如ARM Cortex-M系列) |
内存隔离 | 进程间隔离,防止非法访问 | 无隔离,程序可直接修改任意内存/外设 |
动态分配 | 支持按需分配和交换(malloc /mmap ) | 静态分配(链接脚本定义堆栈/全局变量) |
访问权限控制 | 通过页表实现读/写/执行权限 | 无权限控制,依赖程序员自律 |
典型应用场景 | 通用计算(多任务/复杂应用) | 实时嵌入式系统(确定性/低延迟) |
三、 Linux系统调用函数 fork()、wait()、exec()
3.1 fork
在Linux 中创建一个新进程的唯一方法是使用fork()函数。fork()函数用于从已存在的一个进程中创建一个新的进程,新进程称为子进程,而原进程称为父进程。
-
子进程特性:
-
子进程是父进程的复制品,继承父进程的地址空间,包括代码段、数据段、堆、栈等。
-
子进程继承父进程的文件描述符、信号控制设定、进程优先级、进程组号、当前工作目录等。
-
子进程拥有独立的进程号(PID)和资源使用信息。
-
-
返回值:
-
在父进程中,
fork()
返回子进程的PID。 -
在子进程中,
fork()
返回0。
-
1.在练习文件夹下面利用nano创建函数fork_example.c文件(建议也可以参考下文中树莓派部分的fork函数,那个比较简洁)
#include <stdio.h> // 标准输入输出库,用于printf等函数
#include <sys/types.h> // 包含数据类型定义,如pid_t
#include <unistd.h> // 包含fork、getpid、getppid等函数
#include <stdlib.h> // 包含exit函数
#include <errno.h> // 包含错误号定义
#include <sys/wait.h> // 包含waitpid函数及相关宏int main() {pid_t pid; // 定义一个pid_t类型的变量,用于存储fork返回的进程IDint ret = 1; // 定义一个返回值变量,未在代码中使用int status; // 定义一个变量,用于存储子进程退出状态pid = fork(); // 调用fork函数创建一个子进程if (pid == -1) { // 如果fork返回-1,表示创建子进程失败printf("can't fork, error occured\n"); // 输出错误信息exit(EXIT_FAILURE); // 退出程序,返回值为EXIT_FAILURE} else if (pid == 0) { // 如果fork返回0,表示当前是子进程printf("child process, pid = %u\n", getpid()); // 输出子进程的PIDprintf("parent of child process, pid = %u\n", getppid()); // 输出子进程的父进程PIDchar *argv_list[] = {"ls", "-lart", "/home", NULL}; // 定义一个字符串数组,作为execv的参数// 调用execv替换当前进程映像为"ls"程序,并传递参数"-lart"和"/home"execv("ls", argv_list); // 如果execv成功,控制权将转移到"ls"程序,不会返回到这里// 如果execv失败,返回-1,并继续执行下面的代码exit(0); // 子进程退出} else { // 如果fork返回一个正数,表示当前是父进程,返回值是子进程的PIDprintf("Parent of parent process, pid = %u\n", getppid()); // 输出父进程的父进程PIDprintf("parent process, pid = %u\n", getpid()); // 输出父进程的PID// 父进程调用waitpid等待子进程结束if (waitpid(pid, &status, 0) > 0) { // 如果waitpid成功,返回子进程的PID// 检查子进程是否正常退出if (WIFEXITED(status) && !WEXITSTATUS(status)) // 如果子进程正常退出且返回值为0printf("program execution successful\n");else if (WIFEXITED(status) && WEXITSTATUS(status)) { // 如果子进程正常退出但返回值非0if (WEXITSTATUS(status) == 127) { // 如果返回值为127,表示execv失败printf("execv failed\n");} else // 如果返回值非127,表示程序执行完成但返回了非零状态printf("program terminated normally, but returned a non-zero status\n");} else // 如果子进程没有正常退出printf("program didn't terminate normally\n");} else { // 如果waitpid失败printf("waitpid() failed\n");}exit(0); // 父进程退出}return 0; // 程序正常结束返回0
}
2.使用cmake
编译fork_example.c
在根目录下创建(想着用不同的方法来编译,掌握多种编译办法。也可以直接采用下文的gcc方式来编译)
CMakeLists.txt
cmake_minimum_required(VERSION 3.10) # 最低 CMake 版本要求
project(Fork_demo) # 项目名称# 添加可执行文件
add_executable(fork_demo fork_example.c)# 设置 C 标准(可选)
set(CMAKE_C_STANDARD 11)
3.构建目录生成文件
mkdir build && cd build
创建构建目录并生成 Makefile:
cmake --build build
./build/fork_demo
运行即可,结果如图:
3.2 wait
功能:wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。如果该父进程没有子进程或者它的子进程已经结束,则wait()函数就会立即返回。
-
作用:
-
确保父进程在子进程结束后再继续执行。
-
防止子进程变成僵尸进程(zombie process)。
-
-
返回值:
-
如果父进程没有子进程或者子进程已经结束,
wait()
会立即返回。 -
返回值是子进程的PID。
-
wait调用:
1.创建一个 fork_wait.c
文件,内容如下:
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h> // 必须包含此头文件以使用 wait()int main() {pid_t pid = fork();if (pid < 0) {perror("fork 失败");return 1;} else if (pid == 0) {// 子进程执行任务printf("子进程 PID = %d\n", getpid());sleep(2); // 模拟耗时操作printf("子进程结束\n");} else {// 父进程等待子进程结束printf("父进程 PID = %d,等待子进程 %d...\n", getpid(), pid);int status;wait(&status); // 阻塞等待子进程结束printf("子进程退出状态: %d\n", WEXITSTATUS(status));}return 0;
}
同样的创建Makefile,
# 定义编译器和编译选项
CC = gcc
CFLAGS = -Wall -Wextra -std=c11# 定义目标可执行文件名和源文件
TARGET = fork_wait_demo
SRC = fork_wait.c# 默认目标
all: $(TARGET)# 编译规则
$(TARGET): $(SRC)$(CC) $(CFLAGS) -o $@ $^# 清理生成的文件
clean:rm -f $(TARGET)# 伪目标声明(避免与同名文件冲突)
.PHONY: all clean
编译运行效果:
make
./fork_wait_demo
结果演示:
3.3 exec
在Linux 中使用exec函数族主要有两种情况:
1.当进程认为自己不能再为系统和用户做出任何贡献时,他就可以发挥最后一点余热,调用任何一个exec,让自己以新的面貌重生;
2.如果一个进程想执行另一个程序,那么它就可以调用fork() 函数新建一个进程,然后调用exec 函数族中的任意一个函数,这样看起来就像通过执行应用程序而产生了一个新进程(这种情况非常普遍)。
exec调用:
可以先建一个文件夹哈(这样方便看到保存每个函数的那个记录,我上面两个函数忘记创建了,之后做实验最好一个实验一个文件夹,这样清爽一些)
mkdir exec && cd exec
1.创建 fork_exec.c
文件,参考代码:
#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid == 0) {// 子进程执行 ls -lexecl("/bin/ls", "ls", "-l", NULL);perror("exec failed"); // 若 exec 失败才会执行return 1;}return 0;
}
2.可以用gcc或者make或者cmake等方式来进行编译,我们这里就用常规简单一点的gcc(cmake和make的方式上面两个函数都有代码,修改一下名称就可以用啦)
gcc fork_exec.c -o fork_demo
./fork_demo
结果演示:
四、在树莓派中,创建组员账号,完成练习
4.1 用户创建和配置:
提前进入到主要的账号里边给各个用户加上相关的权限,操作如下(putty和Xterminal都可以)
1.使用adduser
命令创建用户
sudo adduser zsc
-
执行后会提示设置密码及用户信息(非必填项可直接回车跳过)
-
默认自动生成同名主目录
/home/username
2.配置用户权限
1.将用户加入sudo组
sudo usermod -aG sudo zsc
2.加入常用硬件访问组
sudo usermod -aG adm,dialout,plugdev zsc
3. 验证用户权限
id zsc # 查看用户所属组
groups zsc # 列出用户所有附加组
4.2登录自己的树莓派账号练习
在Xterminal中利用ssh连接登陆上自己的树莓派账号。(连接过程和之前的博客步骤一样的,通过电脑移动热点查询物理地址,账号密码确认后即可登录)
我们还可以查看树莓派下面的其他用户
compgen -u
进入到自己的树莓派环境中
配置一下安装一下环境:
在树莓派Ubuntu系统中,默认可能未安装GCC,安装GCC及编译所需的工具链(如make
、g++
等)
sudo apt update
sudo apt install build-essential
1.创建并打开目录
mkdir test0404 && cd test0404
2.编写fork.c程序(选用gcc的方式来编译啦,这样快捷一些)
nano fork_gcc.c
简单的编写一个代码:
#include <stdio.h>
#include <unistd.h>int main() {pid_t pid = fork();if (pid < 0) {fprintf(stderr, "Fork失败\n");return 1;} else if (pid == 0) {printf("子进程ID: %d\n", getpid());} else {printf("父进程ID: %d,子进程ID: %d\n", getpid(), pid);}return 0;
}
3.编译并运行:
gcc fork_gcc.c -o fork_gcc//编译需要卡一会./fork_gcc
五、总结
通过本次让我收获很大很大,本文主要阐述了任务、进程、线程的定义,区别和联系,参考文献1中有更加直白易懂的说法(感兴趣的可以去看看),同时通过查阅资料阐述了虚拟机内存管理和STM32的物理内存中的一些差别,进一步了解虚拟机和存储的方式;最后也是本次最重要的实践环节,学习调用了fork、wait、exec函数,深入理解了每个函数在树莓派的中是如何使用的,同时每个函数的调用用了不同的编译方法(cmake、make、gcc)(个人建议设计内容少的函数可以直接用gcc是最方便的),加深了对Ubuntu的运用和理解,同时通过反反复复的敲代码和命令,对整体的编程水平还是上升了不少,感兴趣的朋友也可以自己试试手敲,收获会很大的。
树莓派的操作也越来越熟悉了,在XTerminal很好用,建议用这个,很不错。
本文中原理部分有些图片来源于网络,如有侵权请及时与我联系删除,本人才疏学浅,如有描述不准确或出错的地方还请海涵,感谢您的阅读!
参考文献:
https://zhuanlan.zhihu.com/p/391496775
https://zhuanlan.zhihu.com/p/403313422
Linux系统调用编程-CSDN博客
Linux Ubuntu 入门基本命令整理_linux ubuntu入门基本命令整理-CSDN博客
相关文章:
【linux学习】linux系统调用编程
目录 一、任务、进程和线程 1.1任务 1.2进程 1.3线程 1.4线程和进程的关系 1.5 在linux系统下进程操作 二、Linux虚拟内存管理与stm32的真实物理内存区别 2.1 Linux虚拟内存管理 2.2 STM32的真实物理内存映射 2.3区别 三、 Linux系统调用函数 fork()、wait()、exec(…...
构建第一个ArkTS应用:Hello World之旅
# 构建第一个ArkTS应用:Hello World之旅 在鸿蒙应用开发的领域中,ArkTS语言为我们提供了强大而便捷的开发方式。今天,就让我们一起踏上构建第一个ArkTS应用——Hello World的奇妙旅程。 ## 一、创建ArkTS工程 1. 首先,我们要使用…...
Mysql 集群架构 vs 主从复制架构
特性主从复制架构MySQL 集群架构适用场景读多写少的场景;备份;高可用高并发读写、实时交易、高可用性场景可扩展性仅读性能可扩展读写都可以水平扩展高可用性手动切换,有限的高可用支持自动故障转移,强高可用支持部署复杂度较简单…...
国产轻量级多途径无限制的高效下载工具介绍
软件介绍 们在日常中常常有下载各类文件的需求,学习资料也好,娱乐文件也罢。有一款国产的BT下载软件——BitComet(比特彗星),它凭借高效且无限制的特性,在下载爱好者中备受青睐。 BitComet属于轻量级的BT下…...
leetcode数组-长度最小的子数组
题目 题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/ 给定一个含有 n个正整数的数组和一个正整数 target** 。** 找出该数组中满足其总和大于等于target的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度**…...
如何理解缓存一致性?
缓存一致性是指在多处理器系统或分布式系统中,确保各个处理器核心或节点的缓存数据与主内存以及其他缓存中的数据保持一致的机制和过程。以下从问题产生原因、一致性协议和实现方式等方面进行详细理解: 1. 问题产生的原因 1.1 缓存存在的必要性 在计…...
智能体(Agent)系统源码解析:AI 自动化办公的未来
—从代码到商业落地,如何用Agent重构企业工作流? 一、Agent系统的核心价值 1. 企业办公效率的瓶颈 重复性任务耗时:数据录入、报表生成、邮件处理等占员工 40% 工作时间跨系统协作低效:OA/CRM/ERP数据孤岛,人工搬运错…...
字符串移位包含问题
字符串移位包含问题 #include <iostream> #include <algorithm> using namespace std; int main(){string a,b;cin>>a>>b;//谁长遍历谁if(a.size()<b.size()) swap(a,b);//1-对整个字符串进行移位for(int i0; i<a.size(); i){//每次循环都将第一…...
【JavaScript】原型链 prototype 和 this 关键字的练习(老虎机)
这个老虎机练习主要考察JavaScript中的原型链(prototype)和this关键字的使用。 主要思路 创建三个轮盘(reels)实例:我们需要创建3个独立的轮盘对象,它们都委托(delegate)到基础的ree…...
Windows强制删除任何你想删除的文件和文件夹
Windows强制删除任何你想删除的文件和文件夹 本教程适用于 Windows 10/11 系统,工具和命令均经过验证。 为什么删除会失败? 权限不足:文件或文件夹可能需要管理员权限才能删除。文件被占用:某个程序正在使用目标文件,…...
【MySQL数据库】锁机制
概述 锁:是计算机协调多个进程或者线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(CPU、RAM、IO)的争用以外。数据也是一种供多用户共享的资源。如何保证数据的并发访问的一致性、有效性是所有数据库必须解决的一个…...
JS dom修改元素的style样式属性
1通过样式属性修改 第三种 toggle有就删除 没就加上...
搜索树——AVL、红黑树、B树、B+树
目录 二叉搜索树 AVL树 2-3-4树 红黑树 旋转操作 概念讲解 旋转节点操作(左旋) 插入节点 删除节点 B树和B树 B树 2.5.2 B树 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 难度高,如果想要了解红黑树的增加、…...
2007-2019年各省地方财政交通运输支出数据
2007-2019年各省地方财政交通运输支出数据 1、时间:2007-2019年 2、来源:国家统计局、统计年鉴 3、指标:行政区划代码、地区、年份、地方财政交通运输支出 4、范围:31省 5、指标说明:地方财政交通运输支出是指地方…...
LeetCode算法题(Go语言实现)_29
题目 给你一个链表的头节点 head 。删除 链表的 中间节点 ,并返回修改后的链表的头节点 head 。 长度为 n 链表的中间节点是从头数起第 ⌊n / 2⌋ 个节点(下标从 0 开始),其中 ⌊x⌋ 表示小于或等于 x 的最大整数。 对于 n 1、2…...
MINIQMT学习课程Day6
学习安装qmt 安装好后,点击启动国金qmt系统 之后将xtquant包手动安装到python中的site_package中,之后使用pycharm打开文件,创建本地命令文件。 具体的xtquant安装包以及qmt模拟环境,以及模拟账号密码,可以加我私信沟…...
WinForm真入门(7)——Button控件详解
WinForm Button 控件详解 Button(按钮)是 WinForm 中最基础的交互控件,用于触发操作(如:点击登录按钮进入系统)或提交数据(如:写好请假申请后,点击提交,把申…...
035-Windows抓屏-GDI
Windows抓屏-GDI 一、技术原理 GDI(Graphics Device Interface)抓屏基于Windows系统提供的图形设备接口,通过设备上下文(DC) 实现屏幕内容捕获。核心流程如下: 获取桌面窗口句柄:通过 //获取…...
复古优雅感涂鸦手绘喷漆街头艺术字体 Enter Sonic Graffiti
Enter Sonic Graffiti 是 Rvq Typefoundry 的新字体,具有优雅感的字符集。要创建漂亮的组合,只需混合大写和小写,然后与其他字符形混合即可。新的 Graffiti 字体样式和 .我将这款字体献给我正在与癌症作斗争的母亲。我希望我的母亲和所有受癌…...
4.4 代码随想录第三十五天打卡
121. 买卖股票的最佳时机 (1)题目描述: , (2)解题思路: class Solution { public:int maxProfit(vector<int>& prices) {int len prices.size();if (len 0) return 0;vector<vector<int>> dp(len, vector<int>(2));dp[0][0] - pr…...
PyTorch 深度学习实战(34):神经架构搜索(NAS)实战
在上一篇文章中,我们探讨了联邦学习与隐私保护技术。本文将深入介绍神经架构搜索(Neural Architecture Search, NAS)这一自动化机器学习方法,它能够自动设计高性能的神经网络架构。我们将使用PyTorch实现基于梯度优化的DARTS方法&…...
【python】速通笔记
Python学习路径 - 从零基础到入门 环境搭建 安装Python Windows: 从官网下载安装包 https://www.python.org/downloads/Mac/Linux: 通常已预装,可通过终端输入python3 --version检查 配置开发环境 推荐使用VS Code或PyCharm作为代码编辑器安装Python扩展插件创建第…...
简易Minecraft python
废话多说 以下是一个基于Python和ModernGL的简化版3D沙盒游戏框架。由于代码长度限制,这里提供一个核心实现(约500行),您可以通过添加更多功能和内容来扩展它: python import pygame import moderngl import numpy a…...
Linux信号处理解析:从入门到实战
Linux信号处理全解析:从入门到实战 一、初识Linux信号:系统级的"紧急电话" 信号是什么? 信号是Linux系统中进程间通信的"紧急通知",如同现实中的交通信号灯。当用户按下CtrlC(产生SIGINT信号&…...
2025-04-04 Unity 网络基础5——TCP分包与黏包
文章目录 1 分包与黏包2 解决方案2.1 数据接口2.2 定义消息2.3 NetManager2.4 分包、黏包处理 3 测试3.1 服务端3.2 客户端3.3 直接发送3.4 黏包发送3.5 分包发送3.6 分包、黏包发送3.7 其他 1 分包与黏包 分包、黏包指在网络通信中由于各种因素(网络环境、API …...
Ubuntu 安装 JMeter:为你的服务器配置做好准备
Apache JMeter 是一个开源的负载测试工具,可以用于测试静态和动态资源,确定服务器的性能和稳定性。在本文中,我们将讨论如何下载和安装 JMeter。 安装 Java(已安装 Java 的此步骤可跳过) 要下载 Java,请遵…...
swift-oc和swift block和代理
一、闭包或block 1.1、swift 闭包表达式作为参数的形式 一、闭包的定义 func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) { print(fn(v1, v2)) } 二、调用 exec(v1: 10, v2: 20, fn: { (v1: Int, v2: Int) -> Int in return v1 v2 }) 1.2、swift 闭包表达式作为…...
【数据结构】_队列
hello 友友们~ 今天我们要开始学习队列啦~ 话不多说,让我们开始吧!GO! 1.队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。 队列具有先进先出FIFO(First In First Out) 入队列&#x…...
【软考中级软件设计师】数据表示:原码、反码、补码、移码、浮点数
数据表示 一、数据表示1、整数的表示(1) 原码(2) 反码(3) 补码:(4) 移码 2、浮点数的表示(IEEE 754标准) 一、数据表示 计算机使用的是二进制,也就是0和1的组合。所有的数据,无论是数字、文字还是图片、声音ÿ…...
Linux(十二)信号
今天我们就要来一起学习信号啦!!!还记得小编在之前的文章中说过的ctrlc吗?之前小编没有详细介绍过,现在我们就要来学习啦!!! 一、信号的基本介绍 首先,小编带领大家先一…...
迪杰斯特拉+二分+优先队列+拓扑+堆优化(奶牛航线Cowroute、架设电话线dd、路障Roadblocks、奶牛交通Traffic)
原文地址 https://fmcraft.top/index.php/Programming/2025040402.html 主要算法 迪杰斯特拉Dijkstra 题目列表 P1:奶牛航线Cowroute 题目描述 题目描述 Bessie已经厌倦了农场冬天的寒冷气候,她决定坐飞机去更温暖的地方去度假。不幸的是…...
【数据结构】树的介绍
目录 一、树1.1什么是树?1.2 树的概念与结构1.3树的相关术语1.4 树形结构实际运用场景 二、二叉树2.1 概念与结构2.2 特殊的二叉树2.2.1 满二叉树2.2.2 完全二叉树 个人主页,点击这里~ 数据结构专栏,点击这里~ 一、树 1.1什么是树࿱…...
【CF】Day24——Codeforces Round 994 (Div. 2) D
D. Shift Esc 题目: 思路: 典DP的变种 如果这一题没有这个变换操作,那么是一个很典型的二维dp,每一个格子我们都选择上面和左边中的最小值即可 而这题由于可以变换,那我们就要考虑变换操作,首先一个显然…...
Python 字典
Python 字典 字典的介绍 字典不仅可以保存值,还能对值进行描述使用大括号来表示一个字典,不仅有值 value ,还有值的描述 key字典里的数据都是以键值对 key-value 的形式来保留的key 和 value 之间用冒号 : 来连接多个键值对之间用逗号 , 来…...
yolov12检测 聚类轨迹运动速度
目录 分割算法api版: 分割算法: yolo_kmean.py 优化版: 第1步,检测生成json 第2步骤聚类: 分割算法api版: import json import os from glob import globimport cv2 import imageio import numpy as np from scipy.ndimage import gaussian_filter1d from scipy.s…...
【Lua】pcall使用详解
目录 基本语法核心作用基础示例示例 1:捕获一个简单错误示例 2:调用不存在的函数 高级用法1. 传递多个参数和接收多个返回值2. 捕获带 error 主动抛出的错误3. 匿名函数与 pcall 使用场景注意事项总结 在 Lua 中,pcall(Protected …...
Floyd 算法 Java
图论算法实践:使用 Floyd 求任意两点最短路(Java 实现) 在图论算法中,Floyd-Warshall 算法是一个经典的动态规划算法,用于在一个加权图中寻找所有点对之间的最短路径。 场景描述 假设我们有一个包含 n 个点的无向图&…...
List结构之非实时榜单实战
像京东、淘宝等电商系统一般都会有热销的商品榜单,比如热销手机榜单,热销电脑榜单,这些都是非实时的榜单。为什么是非实时的呢?因为完全实时的计算和排序对于资源消耗较大,尤其是当涉及大量交易数据时。 一般来说&…...
OCR的备份与恢复
1.简介 在Oracle RAC环境中,ASM(Automatic Storage Management)管理的OCR(Oracle Cluster Registry)是集群的关键组件,存储集群配置和状态信息。 OCR的备份一般指物理备份,系统默认每4个小时自…...
算法思想之双指针(一)
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之双指针(一) 发布时间:2025.4.4 隶属专栏:算法 目录 双指针算法介绍对撞指针:快慢指针: 例题移动零题目链接题目描述算法思路代码实现 复写零题目链接题目描…...
Pascal语言的设备管理
Pascal语言的设备管理 引言 在计算机科学中,设备管理是操作系统的重要组成部分之一。设备管理指的是操作系统对外部设备的控制和协调,实现对各种设备的有效利用。Pascal语言作为一种教育性编程语言,虽然最初并不是为了直接进行设备管理而设…...
【MySQL】DML:添加-修改-删除数据 (数据操作语言) 学习笔记
DML (数据操作语言) 学习笔记 1. 数据表结构 首先创建员工表 employee: CREATE TABLE employee (id int unsigned NOT NULL AUTO_INCREMENT COMMENT ID,username varchar(20) NOT NULL COMMENT 用户名,password varchar(32) DEFAULT 123456 COMMENT 密码,name va…...
React编程高级主题:背压(Backpressure)处理
文章目录 **5.1 背压(Backpressure)概述****5.1.1 缓冲(Buffer)****1. 基本概念****2. 缓冲的实现方式****3. 适用场景****4. 潜在问题** **5.1.2 丢弃(Drop)****1. 基本概念****2. 丢弃的实现方式****3. 适…...
Spring IoCDI
IoC容器 前⾯我们提到IoC控制反转, 就是将对象的控制权交给Spring的IOC容器 ,由IOC容器创建及管理对 象。 也就是bean的存储. 在类上⾯添加 RestController 和 Controller 注解, 就是把这个对象交给Spring管理 , Spring 框架启动时就会加载该类. 把对象…...
COBOL语言的数据库交互
COBOL语言的数据库交互 引言 随着信息技术的不断发展,数据库管理系统(DBMS)已经成为现代应用程序中不可或缺的组成部分。在众多编程语言中,COBOL(Common Business-Oriented Language)以其在商业应用中的稳…...
【C++11(中)】—— 我与C++的不解之缘(三十一)
一、可变参数模版 基本语法: C11支持可变参数模版,简单来说就是支持可变数量参数的函数模版或者类模版; 可变数目的参数被称为参数包,存在两种参数包:模版参数包(表示0个或者多个模版参数),函数参数包(表示…...
JavaScript学习19-事件类型之鼠标事件
1. 2. 3....
文件或目录损坏且无法读取:数据恢复的实战指南
在数字化时代,数据的重要性不言而喻。然而,在日常使用电脑、移动硬盘、U盘等存储设备时,我们难免会遇到“文件或目录损坏且无法读取”的提示。这一提示如同晴天霹雳,让无数用户心急如焚,尤其是当这些文件中存储着重要的…...
python爬虫:小程序逆向实战教程
根据我之前发表的文章,我们进行延伸实战https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序,我们进行搜索 2. 找到我们vx小程序的文件地址,我们就可以进行破解 破解步骤强看…...
第二十节课:python实例五:身体质量指数BMI计算
python实例五:身体质量指数BMI计算 一、问题分析 BMI计算公式: BMI 体重(kg) / 身高(m)^2国际与国内标准对比 分类国际标准国内标准偏瘦<18.5<18.5正常18.5-2518.5-24偏胖25-3024-28肥胖≥30≥28 二、实现要点 输入处理 # 同时接收身高体重…...