7、Linux C 进程通信
一、无名管道(pipe)
1. 函数介绍
#include <unistd.h> int pipe(int pfd[2]);
-
参数:
pfd
是一个包含两个整数的数组,pfd[0]
为读描述符,pfd[1]
为写描述符。 -
返回值:成功时返回0,失败时返回-1,并设置
errno
。 -
作用:创建一个无名管道,用于具有亲缘关系的进程间通信。
2. 特点
-
只能用于具有亲缘关系的进程间通信(父子进程、兄弟进程)。
-
单工通信,一端读,一端写。
-
数据自己读不能自己写。
-
管道可以用于大于2个进程共享。
3. 读写特性
读管道:
-
管道中有数据:
read
返回实际读到的字节数。 -
管道中无数据:
-
写端被全部关闭,
read
返回0(像读到文件结尾)。 -
写端未全部关闭,
read
阻塞等待。
-
写管道:
-
管道读端全部被关闭:进程异常终止(可捕捉
SIGPIPE
信号避免终止)。 -
管道读端未全部关闭:
-
管道已满,
write
阻塞(管道大小64K)。 -
管道未满,
write
将数据写入,并返回实际写入的字节数。
-
4. 示例代码
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> int main(void) {pid_t pid1, pid2;char buf[32];int pfd[2]; // 创建管道if (pipe(pfd) < 0) {perror("pipe");exit(-1);} // 创建两个子进程pid1 = fork();if (pid1 == 0) {// 子进程1写入数据close(pfd[0]); // 关闭读端strcpy(buf, "I'm process 1");write(pfd[1], buf, 32);close(pfd[1]);} else {pid2 = fork();if (pid2 == 0) {// 子进程2写入数据close(pfd[0]); // 关闭读端strcpy(buf, "I'm process 2");write(pfd[1], buf, 32);close(pfd[1]);} else {// 父进程读取数据close(pfd[1]); // 关闭写端wait(NULL); // 等待子进程1结束read(pfd[0], buf, 32);printf("%s\n", buf);wait(NULL); // 等待子进程2结束read(pfd[0], buf, 32);printf("%s\n", buf);close(pfd[0]);}} return 0; }
5. 小结
-
无名管道适用于亲缘进程间的单工通信。
-
创建时返回两个文件描述符,分别用于读写。
-
需要正确管理管道的读写端,避免阻塞和异常终止。
二、有名管道(fifo)
1. 函数介绍
#include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode);
-
参数:
-
pathname
:创建的管道文件路径。 -
mode
:管道文件的权限,如0666
。
-
-
返回值:成功时返回0,失败时返回-1。
-
作用:创建一个有名管道文件,用于非亲缘进程间通信。
2. 特点
-
可使非亲缘的两个进程互相通信。
-
通过路径名操作,在文件系统中可见,但内容存放在内存中。
-
使用文件IO操作。
-
遵循先进先出规则。
-
不支持
lseek
操作。 -
单工读写。
3. 创建与读写
创建有名管道
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> int main(void) {// 创建名为"myfifo"的有名管道,权限为0666if (mkfifo("myfifo", 0666) < 0) {perror("mkfifo");exit(-1);}return 0; }
写入有名管道
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #define N 32 int main(void) {char buf[N];int pfd; // 以只写方式打开有名管道if ((pfd = open("myfifo", O_WRONLY)) < 0) {perror("open");exit(-1);} while (1) {// 从键盘读取输入fgets(buf, N, stdin);// 输入"quit"时退出if (strcmp(buf, "quit\n") == 0) break;// 写入管道write(pfd, buf, N);} close(pfd);return 0; }
读取有名管道
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define N 32 int main(void) {char buf[N];int pfd; // 以只读方式打开有名管道if ((pfd = open("myfifo", O_RDONLY)) < 0) {perror("open");exit(-1);} while (read(pfd, buf, N) > 0) {// 输出读取到的字符串长度printf("the length of string is %d\n", strlen(buf));} close(pfd);return 0; }
4. 注意事项
-
不能以
O_RDWR
(读写)模式打开FIFO文件进行读写操作。 -
O_NONBLOCK
选项表示非阻塞,加上此选项后,open
调用是非阻塞的。 -
对于以只读方式打开的FIFO文件,如果
open
调用是阻塞的,除非有一个进程以写方式打开同一个FIFO,否则它不会返回;如果open
调用是非阻塞的,则即使没有其他进程以写方式打开同一个FIFO文件,open
调用将成功并立即返回。 -
对于以只写方式打开的FIFO文件,如果
open
调用是阻塞的,open
调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open
调用是非阻塞的,open
总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open
调用将返回-1,并且FIFO也不会被打开。 -
如果有多个进程写同一个管道,使用
O_WRONLY
方式打开管道,如果写入的数据长度小于等于PIPE_BUF
(4K),那么或者写入全部字节,或者一个字节都不写入,系统就可以确保数据决不会交错在一起。
5. 小结
-
有名管道适用于非亲缘进程间的单工通信。
-
需要先创建管道文件,再通过文件路径进行读写操作。
-
正确管理管道的打开方式和阻塞模式,确保通信正常进行。
三、内存映射
1.概念
内存映射是一种文件访问机制,它将磁盘上的文件与内存中的缓冲区进行映射,使得进程可以像访问普通内存一样对文件进行读写操作,而无需显式调用read和write函数。
2.mmap()函数的优点
-
实现了用户空间和内核空间的高效交互方式,减少了数据拷贝的次数,提高了程序的性能。
3.函数定义
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
-
功能:创建共享内存映射。
-
返回值:成功时返回创建的映射区首地址;失败时返回MAP_FAILED(((void *) -1)),并设置errno值。
-
参数说明:
-
addr
:指定要映射的内存地址,一般设置为NULL,让操作系统自动选择合适的内存地址。 -
length
:必须大于0。映射地址空间的字节数,从被映射文件开头offset
个字节开始算起。 -
prot
:指定共享内存的访问权限,可取值为PROT_READ(可读)、PROT_WRITE(可写)、PROT_EXEC(可执行)、PROT_NONE(不可访问)。 -
flags
:由以下几个常量指定:MAP_SHARED(共享的)、MAP_PRIVATE(私有的)、MAP_FIXED(表示必须使用start参数作为开始地址,如果失败不进行修正)。其中,MAP_SHARED和MAP_PRIVATE必选其一,而MAP_FIXED不推荐使用。MAP_ANONYMOUS(匿名映射,用于血缘关系进程间通信)。 -
fd
:表示要映射的文件句柄。如果匿名映射写-1。 -
offset
:表示映射文件的偏移量,一般设置为0,表示从文件头部开始映射。
-
4.注意事项
-
创建映射区的过程中,隐含着一次对映射文件的读操作,将文件内容读取到映射区。
-
当MAP_SHARED时,要求映射区的权限应<=文件打开的权限(出于对映射区的保护),如果不满足报非法参数(Invalid argument)错误。当MAP_PRIVATE时,mmap中的权限是对内存的限制,只需要文件有读权限即可,操作只在内存有效,不会写到物理磁盘,且不能在进程间共享。
-
映射区的释放与文件关闭无关,只要映射建立成功,文件可以立即关闭。
-
用于映射的文件大小必须>0,当映射文件大小为0时,指定非0大小创建映射区,访问映射地址会报总线错误,指定0大小创建映射区,报非法参数错误(Invalid argument)。
-
文件偏移量必须为0或者4K的整数倍(否则会报非法参数Invalid argument错误)。
-
映射大小可以大于文件大小,但只能访问文件page的内存地址,否则报总线错误,超出映射的内存大小报段错误。
-
mmap创建映射区出错概率非常高,一定要检查返回值,确保映射区建立成功再进行后续操作。
5.mmap()映射的种类
-
基于文件的映射:将文件内容映射到内存中,多个进程可以通过映射同一文件来共享内存。
-
匿名映射:不与文件关联,适用于具有亲缘关系的进程之间通信。
6.释放内存映射
int munmap(void *addr, size_t length);
-
返回值:成功返回0,失败返回-1,并设置errno值。
-
参数:
-
addr
:调用mmap函数成功返回的映射区首地址。 -
length
:映射区大小(即mmap函数的第二个参数)。
-
7.示例
#include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <unistd.h>int main() {const char *filename = "example.txt";const char *write_str = "Hello, mmap!";int fd;void *addr; // 打开或创建一个文件,确保其大小足够进行映射 fd = open(filename, O_RDWR | O_CREAT, 0666); if (fd == -1) {perror("open");exit(EXIT_FAILURE); }// 调整文件大小以容纳映射内容 if (ftruncate(fd, 4096) == -1) { // 将文件大小设置为一页(4096字节)perror("ftruncate");close(fd);exit(EXIT_FAILURE); }// 将文件映射到内存 addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (addr == MAP_FAILED) {perror("mmap");close(fd);exit(EXIT_FAILURE); }// 写入数据到映射区域 memcpy(addr, write_str, strlen(write_str) + 1); // 包含字符串结束符// 从映射区域读取数据 printf("Read from memory: %s\n", (char *)addr);// 同步映射区域的数据到文件(对于MAP_SHARED,通常不需要显式同步) if (msync(addr, 4096, MS_SYNC) == -1) {perror("msync"); }// 解除内存映射 if (munmap(addr, 4096) == -1) {perror("munmap");close(fd);exit(EXIT_FAILURE); }// 关闭文件描述符 close(fd);return 0; }
四、System V共享内存(过时)
1.概念
System V共享内存是一种高效的进程间通信方式,允许多个进程直接读写同一块内存区域,而无需进行数据拷贝。共享内存在内核空间创建,可被进程映射到用户空间访问,使用灵活。由于多个进程可同时访问共享内存,因此需要同步和互斥机制配合使用。
2.使用步骤
-
生成key:使用ftok函数根据文件路径和项目ID生成一个唯一的key值。
-
创建/打开共享内存:使用shmget函数创建新的共享内存或打开已有的共享内存。
-
映射共享内存:使用shmat函数将共享内存映射到进程的地址空间,以便进行读写操作。
-
读写共享内存:通过映射后的地址指针访问共享内存中的数据。
-
撤销共享内存映射:使用shmdt函数撤销共享内存的映射,释放资源。
-
删除共享内存对象:使用shmctl函数删除共享内存对象,确保资源被正确回收。
3.ftok函数
key_t ftok(const char *path, int proj_id);
-
功能:根据指定的文件路径和项目ID生成一个唯一的key值,用于标识System V IPC对象。
-
返回值:成功时返回合法的key值;失败时返回-1。
-
参数:
-
path
:存在且可访问的文件的路径。 -
proj_id
:用于生成key的数字,范围1-255。
-
4.shmget函数
int shmget(key_t key, int size, int shmflg);
-
功能:创建或打开一个共享内存段。
-
返回值:成功时返回共享内存的ID;失败时返回-1。
-
参数:
-
key
:与共享内存关联的key值,可以是IPC_PRIVATE或由ftok生成。 -
size
:共享内存的大小,以字节为单位。 -
shmflg
:共享内存标志位,通常设置为IPC_CREAT|0666,其中0666表示权限。
-
5.shmat函数
void *shmat(int shmid, const void *shmaddr, int shmflg);
-
功能:将共享内存映射到进程的地址空间。
-
返回值:成功时返回映射后的地址;失败时返回(void *)-1。
-
参数:
-
shmid
:要映射的共享内存ID。 -
shmaddr
:映射后的地址,NULL表示由系统自动映射。 -
shmflg
:标志位,0表示可读写;SHM_RDONLY表示只读。
-
6.shmdt函数
int shmdt(void *shmaddr);
-
功能:撤销共享内存的映射,释放资源。
-
返回值:成功时返回0;失败时返回-1。
-
参数:
-
shmaddr
:映射后的地址指针。
-
7.shmctl函数
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
-
功能:对共享内存进行控制操作,如获取或设置共享内存属性、删除共享内存等。
-
返回值:成功时返回0;失败时返回-1。
-
参数:
-
shmid
:要操作的共享内存ID。 -
cmd
:要执行的操作,常见的有IPC_STAT(获取共享内存状态)、IPC_SET(设置共享内存属性)、IPC_RMID(删除共享内存)。 -
buf
:保存或设置共享内存属性的地址。
-
8.示例代码
生成key
#include <sys/types.h> #include <sys/ipc.h> #include <stdio.h> #include <stdlib.h>int main() {key_t key;if ((key = ftok(".", 'a')) == -1) {perror("ftok");exit(1);}printf("key: %d\n", key);return 0; }
创建共享内存
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h>int main() {key_t key = ftok(".", 'm');int shmid;if ((shmid = shmget(key, 1024, IPC_CREAT | 0666)) == -1) {perror("shmget");exit(1);}printf("Shared memory ID: %d\n", shmid);return 0; }
映射共享内存并读写
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h> #include <string.h>int main() {key_t key = ftok(".", 'm');int shmid = shmget(key, 1024, 0666);char *addr = (char *)shmat(shmid, NULL, 0);if (addr == (char *)-1) {perror("shmat");exit(1);}printf("Enter a message: ");fgets(addr, 1024, stdin);printf("Message stored in shared memory: %s", addr);shmdt(addr);return 0; }
删除共享内存
#include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <stdlib.h>int main() {key_t key = ftok(".", 'm');int shmid = shmget(key, 1024, 0666);if (shmctl(shmid, IPC_RMID, NULL) == -1) {perror("shmctl");exit(1);}printf("Shared memory deleted.\n");return 0; }
9.注意事项
-
每块共享内存大小有限制,可以通过
ipcs -l
或cat /proc/sys/kernel/shmmax
查看。 -
共享内存删除的时间点:添加删除标记后,当nattach变成0时真正删除。
相关文章:
7、Linux C 进程通信
一、无名管道(pipe) 1. 函数介绍 #include <unistd.h> int pipe(int pfd[2]); 参数:pfd是一个包含两个整数的数组,pfd[0]为读描述符,pfd[1]为写描述符。 返回值:成功时返回0,失败时…...
Android Framework 层 Hook 技术详解
目录 Hook 技术概述 什么是 Hook 技术? Hook 技术的核心原理 Hook 技术的进化与创新 Hook 技术的魅力与局限 Android Framework 层结构 Framework 层在 Android 中的位置 Framework 层的核心组件 为什么 Framework 层适合 Hook? 常用 Hook 方法 方法替换:换个 “芯…...
java接口中 使用@RequestParam和@RequestPart区别
1. 介绍 这两个注解都是spring注解。 RequestParam通常用于获取请求参数,这些参数可以是URL中的查询参数,也可以是表单数据中的字段。而RequestPart则是用于处理多部分(multipart)请求中的部分,特别是当上传文件或处理…...
CentOS-7.0系统基础操作
配置ip地址 编辑网卡文件: vi etc/sysconfig/network-scripts/ifcfg-ens33 在网卡文件里参照如下设置: BOOTPROTO"static" IPADDR192.168.61.233 GATEWAY192.168.61.2 NETMASK255.255.255.0 ONBOOT"yes" 防火墙管理 开启防火墙&am…...
全星研发管理APQP软件系统:驱动汽车产品研发全周期,打造高效合规的质量管理引擎
全星研发管理APQP软件系统:驱动汽车产品研发全周期,打造高效合规的质量管理引擎 在汽车、电子、医疗器械等高度依赖质量管理的行业中,APQP(先期产品质量策划)作为国际通用的产品开发管理框架,是确保产品从…...
Maven 的下载与安装
背景 为什么要建立本地Maven ,idea 默认的maven 仓库是放在系统盘的,依赖每次都存在系统盘用就了C盘就爆炸了,所有我们可以在本地其他盘安装maven 建立仓库。 idea 默认的依赖拉取地址是maven 官网,我们建立本地仓库,…...
26考研——排序_插入排序(8)
408答疑 文章目录 二、插入排序基本概念插入排序方法直接插入排序算法描述示例性能分析 折半插入排序改进点算法步骤性能分析 希尔排序相关概念示例分析希尔排序的效率效率分析空间复杂度时间复杂度 九、参考资料鲍鱼科技课件26王道考研书 二、插入排序 基本概念 定义&#x…...
Mem0 Prompt优化
在使用mem0的时候,系统中自带的提取事件的Prompt, 效果很差,我们可以按照我们的需求修改 from datetime import datetime, timedeltacustom_fact_extraction_prompt f"""你是一位个人信息整理专家,专注于准确存…...
C++ STL常用算法之常用算术生成算法
常用算术生成算法 学习目标: 掌握常用的算术生成算法 注意: 算术生成算法属于小型算法,使用时包含的头文件为 #include <numeric> 算法简介: accumulate // 计算容器元素累计总和 fill // 向容器中添加元素 accumulate 功能描述: 计算区间内容器元素…...
Kubernetes Webhook必要知识点:原理、配置与实践
#作者:邓伟 文章目录 1. 什么是 Kubernetes Webhook?2. Webhook 的工作原理2.1 准入控制器(Admission Controller)2.2 Webhook 类型 3. Webhook 的配置3.1 Webhook 配置文件3.2 配置字段说明 4. Webhook 的开发与部署4.1 开发 We…...
IGS 转 STL 全攻略:迪威模型在线转码助力 3D 建模
在 3D 建模与制造业领域,不同文件格式之间的转换是经常面临的重要任务。IGS 和 STL 作为其中两种常用格式,前者凭借出色的曲面表达能力,在 CAD 领域广泛应用;后者凭借简单的三角网格结构,成为 3D 打印、快速成型的行业…...
【Bug】记录2025年遇到的Bug以及修复方案
--------------------------------------------------------分割线 2025.3.25-------------------------------------------------------windows环境下通过命令行终端(必须是命令行下,直接赋值传递,代码正常)的形式传递字符串时&a…...
Unity UGUI - 六大基础组件
目录 一、Canvas上 1. Canvas:复制渲染子UI控件 2. ✨Canvas Scaler✨:画布分辨率自适应 3. Graphics Raycaster:射线事件响应 4. ✨Rect Transform✨:UI位置锚点对齐 二、Event System上 5. Event System 6. Standalone …...
TCP网络编程与多进程并发实践
一、引言 在网络编程中,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。而多进程并发则是一种提高服务器处理能力的有效手段,允许服务器同时处理多个客户端的请求。本文将详细介绍如何使用 TCP 协议进…...
IM腾讯Trtc与vod云点播:实现合流录制并上传,根据参数返回视频地址
全文目录,一步到位 1.前言简介1.1 专栏传送门1.1.1 文档传送门 2. java基础使用2.1 准备工作2.1.1 云控制台获取(密钥和密钥secret)2.1.2 找到trtc控制台2.1.3 vod云点播控制台 2.2 使用准备的数据进行操作2.2.0 引入依赖2.2.1 创建TrtcUtils工具类2.2.2 TrtcReqDTO 录制请求dt…...
HTTP协议手写服务器
目录 一、请求的是Web根目录 二、GET方法通过URL传参 三、根据资源类型对应出Content-Type值 四、Http代码 项目完整源代码:Http 周不才/cpp_linux study - 码云 - 开源中国 一、请求的是Web根目录 如果URL中请求的资源是Web根目录,则自动跳转到主…...
Uni-app入门到精通:subPackages节点为小程序的分包加载配置
subPackages节点用于为小程序的分包加载配置。因小程序有体积和资源加载限制,各小程序平台提供了分包方式,以加快小程序的下载和启动速度。主包用于放置默认启动页面、babBar页面,以及一些所有分包都会用到的公共资源或JS脚本;而分…...
DeepSeek本地部署(linux)
一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 1.1在线下载安装 可复制此命令到Linux服务器进行在线下载,如下载速度过慢,可选择离线下载安装。 curl -fsSL https://ollama.com/install.sh | sh1.2离线下载安装 …...
工具——(常用的软件)视频编辑器
软件工具 1、视频编辑器:filmora 9 2、图标无损放大:oCam 或者 Adobe Illustrator CS6 3、图片编辑:Photoshop CS6 4、截图置顶工具:Snipaste 或者 PixPin 5、抢票:Bypass 6、文本日志工具:N…...
Kafka 多线程开发消费者实例
目前,计算机的硬件条件已经大大改善,即使是在普通的笔记本电脑上,多核都已经是标配了,更不用说专业的服务器了。如果跑在强劲服务器机器上的应用程序依然是单线程架构,那实在是有点暴殄天物了。不过,Kafka …...
org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 Maven打包失败
org.apache.maven.surefire:surefire-junit-platform:jar:2.22.2 解决办法 勾上这个,打包时跳过测试代码...
在Ubuntu中固定USB设备的串口号
获取设备信息 lsusb # 记录设备的Vendor ID和Product ID(例如:ID 0403:6001)# 获取详细属性(替换X和Y为实际设备号) udevadm info -a /dev/ttyUSBX 结果一般如下 创建udev规则文件 sudo gedit /etc/udev/rules.d/us…...
Java后端开发: 如何安装搭建Java开发环境《安装JDK》和 检测JDK版本
文章目录 一、JDK的安装1、 打开 Oracle 官方网址2、点击产品 二、检测JDK是否安装成功以及JDK版本的查看1. 打开命令行窗口检测是否安装成功查看 JDK 版本 一、JDK的安装 1、 打开 Oracle 官方网址 Oracle官网地址:https://www.oracle.com/cn/ 2、点击产品 打开下载的JDK文件…...
AudioFlinger与AudioPoliceManager初始化流程
AF/APF启动流程 在启动AudioSeriver服务的过程中会对启动AF/APF。main_audioserver.cpp有如下代码: AudioFlinger::instantiate();AudioPolicyService::instantiate();AF初始化流程 1.AudioFlinger::instantiate() 1.1 AudioFlinger构造函数 void AudioFlinger:…...
Keepalive+LVS+Nginx+NFS高可用架构
KeepaliveLVSNginxNFS高可用架构 1. NFS 业务服务器(192.168.98.138)2. Web服务集群(搭建RS服务器)开机自启动自动挂载配置nginx(为了区分Web1与Web2访问的文件内容) 3. LVS主机(Keepalivedlvs&…...
SpringBoot分布式项目订单管理实战:Mybatis最佳实践全解
一、架构设计与技术选型 典型分布式订单系统架构: [网关层] → [订单服务] ←→ [分布式缓存]↑ ↓ [用户服务] [支付服务]↓ ↓ [MySQL集群] ← [分库分表中间件]技术栈组合: Spring Boot 3.xMybatis-Plus 3.5.xShardingSpher…...
ctfshow WEB web8
首先确定注入点,输入以下payload使SQL恒成立 ?id-1/**/or/**/true 再输入一下payload 使SQL恒不成立 ?id-1/**/or/**/false 由于SQL恒不成立, 数据库查询不到任何数据, 从而导致页面空显示 由以上返回结果可知,该页面存在SQL注入,注入点…...
当AI代写作业成为常态:重构智能时代的教育范式
2023年春季,某重点高中教师发现全班35%的作文呈现相似AI生成特征;同年国际数学竞赛中,参赛选手使用AI解题引发伦理争议。当GPT-4在SAT考试中取得1520分,当Claude3能撰写专业学术论文,教育领域正面临百年未有之大变革。这场技术革命倒逼我们重新思考:在AI能完成知识性任务…...
基于杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码
一、杜鹃鸟鲶鱼优化算法 杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法模拟了杜鹃鸟鲶鱼的搜索、捕食和寄生慈鲷行为。该算法的早期迭代侧重于执行多维包络搜索策略和压缩空间策略,并结合辅助搜索策略来有效限制慈鳔的逃逸空…...
Ubuntu 22.04.5 LTS 设置时间同步 ntp
提示:文章为操作记录,以备下次使用 文章目录 前言一、设置ntp1.1替换国内源1.2 更新源&安装1.3 验证 前言 设置时间同步,环境版本 # cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_…...
搭建前端环境和后端环境
搭建前端环境 ①、安装vscode,并安装相应的插件工具 ②、安装node.js,可以选择当前版本,或者其他版本 ③、创建工作区 创建一个空文件夹,然后通过vscode工具打开,保存为后缀名为.code-workspace ④、从gitee…...
【VirtualBox 安装 Ubuntu 22.04】
网上教程良莠不齐,有一个CSDN的教程虽然很全面,但是截图冗余,看蒙了给我,这里记录一个整洁的教程链接。以备后患。 下载安装全流程 UP还在记录生活,看的我好羡慕,呜呜。 [VirtualBox网络配置超全详解]&am…...
好用的Markdown阅读编辑器Typora破解记录
Typora破解 一、下载Typora二、安装Typora三、破解Typora 😀 记录一下Typora破解记录,怕不常用忘记咯,感觉自己现在的脑子就像我的肠子一样,刚装进去就么得了。。。😔 Typroa算是用起来很舒服的Markdown阅读器了吧&am…...
系统与网络安全------Windows系统安全(1)
资料整理于网络资料、书本资料、AI,仅供个人学习参考。 用户账号基础 本地用户账号基础 用户账号概述 用户账号用来记录用户的用户名和口令、隶属的组等信息 每个用户账号包含唯一的登录名和对应的密码 不同的用户身份拥有不同的权限 操作系统根据SID识别不同…...
使用 Docker Compose 在单节点部署多容器
Docker Compose 是什么 Docker Compose 是一个用于运行多容器应用的工具, 通过一个docker-compose.yml文件, 配置应用的服务、网络和卷,然后使用简单的命令启动或停止所有服务 为什么需要 Docker Compose 当你有一个包含多个相互依赖的容器应用时,手动…...
CSS中的em,rem,vm,vh详解
一:em 和 rem 是两种相对单位,它们常用于 CSS 中来设置尺寸、字体大小、间距等,主要用于更灵活和响应式的布局设计。它们与像素(px)不同,不是固定的,而是相对于其他元素的尺寸来计算的。 1. em …...
MQTT之重复消息(5、TCP重连和MQTT重连)
目录 1. TCP 协议层的重传(原生机制) 2. 触发 TCP 重传的具体场景 3、TCP 重传的关键参数(了解) 第一、重传超时(RTO - Retransmission Timeout) 第二、重传次数 第三、累计时间 vs 本次 RTO 的区别 第四.常见问题解答 第…...
Ground Truth(真实标注数据):机器学习中的“真相”基准
Ground Truth:机器学习中的“真相”基准 文章目录 Ground Truth:机器学习中的“真相”基准引言什么是Ground Truth?Ground Truth的重要性1. 模型训练的基础2. 模型评估的标准3. 模型改进的指导 获取Ground Truth的方法1. 人工标注2. 众包标注…...
Android学习总结之通信篇
一、Binder跨进程通信的底层实现细节(挂科率35%) 高频问题:“Binder如何实现一次跨进程方法调用?” 候选人常见错误: 仅回答“通过Binder驱动传输数据”,缺乏对内存映射和线程调度的描述混淆Binde…...
自动化发布工具CI/CD实践Jenkins部署与配置教程
1. 前言背景 其实一直想把jenkins 的笔记整理下,介于公司这次升级jenkins2.0 ,根据自己部署的一些经验,我把它整理成笔记。 之前我们的jenkins1.0 时代 还一直停留在 free style 或者 maven 风格的项目,随着项目的日益增多&#x…...
kubernet在prometheus+alertmanager+grafana框架下新增部署loki模块
整个框架拓扑图 #mermaid-svg-OK7jgNZ2I7II8nJx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-icon{fill:#552222;}#mermaid-svg-OK7jgNZ2I7II8nJx .error-text{fill:#552222;stroke:#552…...
Ubuntu下UEFI安全启动安装Nvdia驱动
简介 众所周知,Ubuntu默认使用Nouveau开源驱动,其性能受限,因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单,只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可,…...
Java多线程与高并发专题—— CyclicBarrier 和 CountDownLatch 有什么异同?
引入 上一篇我们了解CountDownLatch的原理和常见用法,在CountDownLatch的源码注释中,有提到: 另一种典型用法是将一个问题分解为 N 个部分,用一个Runnable描述每个部分,该Runnable执行相应部分的任务并对闭锁进行倒计…...
【深度学习】不管理论,入门从手写数字识别开始
1. 环境安装 学习深度学习,开发语言是Python。Python开发工具有很多。其中 anaconda vscode的Python开发环境很好用,建议使用这个组合。 编写手写数字识别测试代码,需要在使用Anaconda安装以下4个库: NumpyScipymatplotlibsci…...
Docker使用ubuntu
1. 更换源 sudo nano /etc/docker/daemon.json //daemon.conf查找最新可用的源1、2,手动查找会不断更新! 1.1 添加DNS sudo nano /etc/resolv.confnameserver 8.8.8.8 nameserver 8.8.4.4 2. 修改配置文件后重新加载 sudo systemctl daemon-relo…...
Windows 系统下多功能免费 PDF 编辑工具详解
IceCream PDF Editor是一款极为实用且操作简便的PDF文件编辑工具,它完美适配Windows操作系统。其用户界面设计得十分直观,哪怕是初次接触的用户也能快速上手。更为重要的是,该软件具备丰富多样的强大功能,能全方位满足各类PDF编辑…...
影响HTTP网络请求的因素
影响 HTTP 网络请求的因素 1. 带宽 2. 延迟 浏览器阻塞:浏览器会因为一些原因阻塞请求,浏览器对于同一个域名,同时只能有4个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制&…...
OpenGL —— 流媒体播放器 - ffmpeg解码rtsp流,opengl渲染yuv视频(附源码,glfw+glad)
🔔 OpenGL 相关技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 效果 说明 FFMpeg和OpenGL作为两大技术巨头,分别在视频解码和图形渲染领域发挥着举足轻重的作用。本文将综合两者实战视频播放器,大概技术流程为:ffmpeg拉取rtsp协议视频流,并…...
Java + LangChain 实战入门,开发大语言模型应用!
在 Baeldung 上看到了一篇介绍基于 Java LangChain 开发大语言模型应用的基础入门文章,写的非常不错,非常适合初学者。于是,我抽空翻译了一下。 原文地址:https://www.baeldung.com/java-langchain-basics翻译: Java…...
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解
【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解 文章目录 【目标检测】【深度学习】【Pytorch版本】YOLOV1模型算法详解前言YOLOV1的模型结构YOLOV1模型的基本执行流程YOLOV1模型的网络参数YOLOV1模型的训练方式 YOLOV1的核心思想前向传播阶段网格单元(grid cell)…...