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

【Linux】进程间通信

目录

一、管道

(一)概念

(二)匿名管道

1、概念

2、函数介绍

3、示例代码

4、原理

(三)命名管道

1、概念

2、函数介绍

3、示例代码

4、原理

(四)管道的读写规则

(五)管道的本质

二、system V共享内存

(一)概念

(二)相关指令

(三)相关系统调用接口

(四)共享内存的优缺点

1、优点

2、缺点

(五)利用共享内存进行进程间通信


一、管道

(一)概念

        管道是Linux下一种进程间通信的形式,我们把一个进程连接到另一个进程的数据流称为一个管道。

(二)匿名管道

1、概念

        匿名管道是Linux操作系统中用于进程间通信的一种机制。它允许两个进程进行双向通信(半双工),必须是拥有血缘关系的进程,通常用于父子进程之间的通信。

        匿名管道是“匿名”的,因为它只在创建它的进程和它创建的子进程之间存在,并且没有文件系统中的对应文件。

2、函数介绍

NAMEpipe - create an interprocess channel
SYNOPSIS#include <unistd.h>int pipe(int fildes[2]);
RETURN VALUEUpon successful completion, 0 shall be returned; otherwise, -1 shall be returned and errno set to indicate the error.

        该函数是传入一个数组,底层创建管道并返回该数组,其中 fildes[0] 为读端, fildes[1] 为写端,成功时返回0,失败返回-1。

        当我们创建好管道后,因管道为半双工传输数据,我们若关闭父进程的读写段时,也要相应的关闭子进程的写读段。

3、示例代码

#include <stdio.h>
#include <unistd.h>
#include <cassert>
#include <cstring>
int main()
{//创建管道int pipefd[2];int ret = pipe(pipefd);assert(ret == 0);//创建子进程pid_t id = fork();if(id == 0){//子进程//关闭写端close(pipefd[1]);char buff[1024] = {0};ssize_t num = read(pipefd[0], buff, sizeof(buff));assert(num != -1);printf("%s", buff);}//父进程关闭读端close(pipefd[0]);const char* str = "i am father";ssize_t num = write(pipefd[1], str, strlen(str));return 0;
}

        上述代码是父进程对管道进行写入,而子进程对管道进行读出并输出至屏幕。

4、原理

        pipe() 函数实际上是新打开了一个文件,而传入的数组是用来记录该文件的读写端,也就是数组内存储的元素实际上文件描述符,其中 fildfd[0]是为读的方式打开的文件的文件描述符, fildfd[1]是为写的方式打开的文件的文件描述符。

        上文中提到,匿名管道一般用于具有血缘关系的进程间通信。其原理为:利用 fork() 创建子进程后操作系统会将父进程的相关内核数据结构拷贝给子进程,我们在调用 fork() 之前执行 pipe() 函数,为父进程创建文件(管道)并返回该文件的读写端,fork() 之后子进程也继承了对该文件的读写端,因此实现了父子进程通过该文件进行通信。

(三)命名管道

1、概念

        命名管道是一种特殊的文件系统对象,它允许不相关的进程进行双向通信。与匿名管道不同,命名管道在文件系统中有一个名字和路径,因此它不仅限于父子进程之间的通信,任何拥有适当权限的进程都可以访问和使用它。

2、函数介绍

NAMEmkfifo - make a FIFO special file (a named pipe)SYNOPSIS#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode);
RETURN VALUEOn success mkfifo() returns 0.  In the case of an error, -1 is returned 

        该函数是在同级目录创建一个管道文件,其中 pathname 为该文件的名称,而 mode 则是创建该文件时的权限。

3、示例代码

// .h
#include <iostream>
#include <unistd.h>
#include <cstring>
#include <cassert>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define PIPE_NAME "mypipe.pipe"
using namespace std;//process1.cpp
#include "proc.h"
int main()
{// 创建管道umask(0);int ret = mkfifo(PIPE_NAME, 0666);assert(ret != -1);// 打开管道文件int id = open(PIPE_NAME, O_WRONLY);assert(id != -1);// 写入管道const char *str = "Hello world";ssize_t num = write(id, str, strlen(str));assert(num != -1);return 0;
}//process2.cpp
#include "proc.h"
int main()
{// 打开管道文件int id = open(PIPE_NAME, O_RDONLY);assert(id != -1);// 写入管道char buff[1024] = {0};ssize_t num = read(id, buff, sizeof(buff) - 1);assert(num != -1);buff[num] = 0;cout << buff << endl;return 0;
}

        上述代码是由process1创建管道文件并向管道文件进行写入,二process2打开管道并进入读出。

4、原理

        与匿名管道不同,命名管道是直接在程序中创建管道文件,并不依赖进程的继承因此适用于任何具有权限的进程进行通信,其本质也是对文件的操作,即不同的进程分别对同一文件进行读写。

(四)管道的读写规则

        管道大小是固定的,也就是其只能存储一定量的数据,下面是管道的读写规则:

        1、当写端持续写入讲管道写满后,写端被阻塞,直到数据被读出;

        2、当读端持续从管道读数据并读完后,读端被阻塞,直到数据被写入;

        3、当管道建立并读写端打开后,若写端关闭,则 read() 读取会返回0;

        4、当管道建立并读写端打开后,若读端关闭,则写端进程会直接退出。

(五)管道的本质

        无论是匿名管道还是命名管道,其本质都是文件,即符合Linux下一切皆文件。但实际上与普通的文件不同。

        对于匿名管道来说,其读写的数据实际存储在内存中的一片缓冲区里;对于命名管道来说,虽然其有用独立的 inode 节点,但是读写的数据并不存在在文件本身(磁盘),而是被加载至内存中的缓冲区。也就是管道通信实际上是依托于文件系统,利用内存的进程间的通信。

        管道的特点:

        1、管道具有生命周期;

        2、管道是面向字节流的;

        3、管道是半双工通信;

        4、管道可以用来进行具有血缘关系的进程间通信;

        5、管道具有同步互斥的机制,以保护共享资源。

二、system V共享内存

(一)概念

       System V共享内存是一种进程间通信机制,它允许多个进程共享同一块物理内存区域。一旦共享内存被创建并且映射到进程的地址空间,进程可以直接读写内存,无需数据在用户空间和内核空间之间的复制。

        共享内存的原理是在物理内存中开辟一块可以让所有进程都看到的内存空间,然后通过页表将这块物理内存映射到进程地址空间中。这样,多个进程就可以通过这块共享内存来读取或写入数据,实现进程间的通信。

        需要注意的是共享内存的生命周期是伴随操作系统的,进程退出并不会影响其生命周期,因此共享内存在确认以后不再使用后需要手动释放资源。

(二)相关指令

1、查看共享内存

ipcs -m    //查看共享内存块

        对于上图中的字段:

        (1)key:共享内存块的键值,用于标识共享内存段(系统);

        (2)shmid:共享内存块的标识符,是唯一的数字,除了有系统内部标识的作用外对上层用户的使用也是通过该字段(用户);

        (3)owner:共享内存块的所有者用户名;

        (4)perms:共享内存块的权限,类似于文件权限;

        (5)bytes:共享内存块的大小,单位是字节;

        (6)nattch:共享内存块上的进程挂载数;

        (7)status:共享内存块的状态,例如“dest”(正在被销毁)或其他状态。

2、删除共享内存

ipcrm -m shmid    //删除共享内存块

(三)相关系统调用接口

1、形成key值

NAMEftok - convert a pathname and a project identifier to a System V IPC key
SYNOPSIS#include <sys/types.h>#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);
RETURN VALUEOn success, the generated key_t value is returned.  On failure -1 is returned, with errno indicating the error as for the stat(2) system call.

        使用 ftok() 函数来构造创建共享内存块所使用的 key 值,也就是共享内存块的 key 值实际是由用户决定的,而 ftok() 函数是将一个路径以及 id 采用算法组合为一个唯一 key 值,当然如果传入的参数相同,那么构造出来的 key值 也相同。

        其中 pathname 参数为项目所在路径,proj_id 参数为项目 id 。其实我们可以约定一个路径和 id 作为构造 key 值的参数。执行成功时返回构造的 key 值,失败返回-1。

2、创建共享内存块

NAMEshmget - get an XSI shared memory segment
SYNOPSIS#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);
RETURN VALUEUpon successful completion, shmget() shall return a non-negative integer, namely a shared memory identifier; otherwise, it shall return -1 and set errno to indicate the error.

        shmget() 函数用于创建共享内存块,分入传入构造好的 key 值,共享内存块的大小(一般为4KB的整数倍),以及 shmflg 标志位,该标志位采用位图的思想。执行成功返回 shmid ,失败返回-1。

        当我们需要申请创建共享内存块时,一般标志位传入 IPC_CREAT、IPC_EXCL以及初始权限。

        IPC_CREAT:传入该标志码,系统按照传入的 key值 进行查找,若内存块不存在则创建内存块,若内存块已存在则返回该内存块。

        IPC_EXCL:一般配合 IPC_CREAT 使用,传入该标志码,系统按照传入的 key值 进行查找,若内存块不存在则创建,若内存块存在则报错返回。

3、关联/去关联共享内存块

(1)关联

NAMEshmat - XSI shared memory attach operation
SYNOPSIS#include <sys/shm.h>void *shmat(int shmid, const void *shmaddr, int shmflg);
RETURN VALUEUpon successful completion, shmat() shall increment the value of shm_nattch in the data structure associated with the shared memory ID of the attached shared memory segment and return the  segment'sstart address.Otherwise, the shared memory segment shall not be attached, shmat() shall return -1, and errno shall be set to indicate the error.

        shmat() 函数用于将共享内存块链接到进程地址空间,成功时返回共享内存块映射到进程地址空间的内存,失败则返回-1,其中连接内存块的 id,shmaddr为内存块的地址, shmflg为连接时的标志位。

        对于 shmaddr 而言,shmaddr为NULL,核心自动选择一个地址 ;shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址; shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍; shmflg=SHM_RDONLY,表示连接操作用来只读共享内存。

        如果对映射后的地址没有要求的话,shmaddr 和 shmflg 分别传入 nullptr 和 0 即可。 

(2)去关联

NAMEshmdt - XSI shared memory detach operation
SYNOPSIS#include <sys/shm.h>int shmdt(const void *shmaddr);
RETURN VALUEUpon successful completion, shmdt() shall decrement the value of shm_nattch in the data structure associated with the shared memory ID of the attached shared memory segment and return 0.Otherwise, the shared memory segment shall not be detached, shmdt() shall return -1, and errno shall be set to indicate the error.

        使用 shmdt() 函数讲进程与共享内存块进行脱离,成功时返回0,失败时返回-1,其中 shmaddr 为执行 shmat() 函数返回的地址。

        进程脱离共享内存块并不等于删除共享内存块。

4、删除共享内存块

SYNOPSIS#include <sys/shm.h>int shmctl(int shmid, int cmd, struct shmid_ds *buf);
RETURN VALUEUpon successful completion, shmctl() shall return 0; otherwise, it shall return -1 and set errno to indicate the error.

        使用 shmtcl() 函数实际是对共享内存块进行控制处理,只有带有IPC_RMID参数才是删除共享内存块。其中 shmid 为目标共享内存块的 id, cmd是采取的动作, buf 则是我们可以将共享内存块针对用户级别的结构体 shmid_ds 属性取出,当是删除操作时,删除成功返回0,失败返回-1。

命令说明
IPC_STAY将shmid_ds结构中的数据设置为共享内存块的当前关联值
IPC_SET在满足权限下,将共享内存块的当前关联值设为为给出的结构体值
IPC_RMID删除共享内存块

(四)共享内存的优缺点

1、优点

(1)高效性:共享内存允许多个进程直接访问同一块物理内存区域,无需数据复制,减少了内核空间与用户空间之间的上下文切换和内存复制开销,从而提高了通信效率。

(2)快速访问:由于共享内存直接映射到进程的地址空间,进程可以像访问普通内存一样快速读写共享内存中的数据,这使得共享内存在性能上非常高效,适合高效的数据交换场景。

(3)灵活性:共享内存可以用于任意类型的数据,包括结构化数据、对象等,因此非常灵活。

2、缺点

(1)同步问题:多个进程可以同时访问共享内存,因此需要额外的同步机制来确保数据的一致性和完整性,比如信号量、互斥锁等。

(2)安全性:共享内存的使用需要特别小心,因为在没有适当的同步和保护机制的情况下,可能会导致竞争条件和数据损坏。

(五)利用共享内存进行进程间通信

//common.hpp
#include <iostream>
#include <unistd.h>
#include <cstring>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#define MAX_SIZE 4096
#define PATH_NAME "."
#define PROC_ID 216
using namespace std;
// 获取key值
key_t getKey()
{key_t key = ftok(PATH_NAME, PROC_ID);if (key == -1){cerr << "getKey:" << strerror(errno) << endl;}return key;
}
// 获取shmId
int getShmHelper(int flag)
{key_t key = getKey();umask(0);int ret = shmget(key, MAX_SIZE, flag);if (ret == -1){cerr << "getShmHelper:" << strerror(errno) << endl;exit(1);}return ret;
}
// 创建Shm
int createShm()
{return getShmHelper(IPC_CREAT | IPC_EXCL | 0666);
}
// 获取Shm
int getShm()
{return getShmHelper(IPC_CREAT);
}
// 获取Shm地址
void *attachShm(int shmId)
{void *mem = shmat(shmId, nullptr, 0);if ((long)mem == -1){cerr << "attachShm:" << strerror(errno) << endl;exit(3);}return mem;
}
// 去关联
void detachShm(void *mem)
{int ret = shmdt(mem);if (ret == -1){std::cerr << "shmdt: " << errno << strerror(errno) << std::endl;exit(4);}
}
// 清理Shm
void removeShm(int shmId)
{int ret = shmctl(shmId, IPC_RMID, nullptr);if (ret == -1){cerr << "removeShm:" << strerror(errno) << endl;exit(2);}
}//server.cpp
#include "common.hpp"
int main()
{// 创建shmint shmId = createShm();// 获取共享内存char *mem = (char *)attachShm(shmId);// 读取数据while (true){printf("Server:%s\n ", mem);sleep(1);}// 去关联detachShm(mem);// 清楚shmremoveShm(shmId);
}//client.cpp
#include "common.hpp"
int main()
{// 获取shmint shmId = getShm();// 获取共享内存char *mem = (char *)attachShm(shmId);// 写入数据int cnt = 0;pid_t pid = getpid();snprintf(mem, MAX_SIZE, "i am client process");// 去关联detachShm(mem);
}

相关文章:

【Linux】进程间通信

目录 一、管道 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;匿名管道 1、概念 2、函数介绍 3、示例代码 4、原理 &#xff08;三&#xff09;命名管道 1、概念 2、函数介绍 3、示例代码 4、原理 &#xff08;四&#xff09;管道的读写规则 &#x…...

Python 网络爬虫高级教程:分布式爬取与大规模数据处理

经过基础爬虫和进阶爬虫的学习&#xff0c;我们已经掌握了爬虫的基本原理、动态内容处理及反爬机制的应对。然而&#xff0c;当我们面对海量数据或需要高效爬取多个站点时&#xff0c;分布式爬虫和数据存储、处理能力就显得尤为重要。本篇博客将带你迈向网络爬虫的高级阶段&…...

猫爪背后的情感密码

当家中那只可爱的猫咪时不时用它的小爪子轻拍我们时&#xff0c;很多人或许只当作是调皮捣蛋&#xff0c;实则背后大有深意。 猫用爪子打&#xff0c;可能是在向我们发出玩耍的邀约。在猫咪的天性里&#xff0c;捕猎本能根深蒂固。它们在幼年时与同伴的嬉戏打闹&#xff0c;便…...

【自用】管材流转项目前端重部署流程 vue2 webpackage4 vuecli4

一、配置 1.下载项目&#xff0c;使用 IDEA 打开&#xff0c;并配置 Nodejs 它提示我&#xff0c;需要 Node.js&#xff0c;因为 nodejs 14 的 installer 已经官网已经找不到了&#xff0c;使用 fnm 又太麻烦&#xff0c; 所以直接采用在 IDEA 中下载的方式就好了。 2.清除缓…...

关于c的子进程 fork()

fork() 是一个非常重要的系统调用&#xff0c;用于在 Unix-like 操作系统中创建一个新的进程。它会将当前进程&#xff08;父进程&#xff09;复制成一个新的进程&#xff08;子进程&#xff09;。子进程会从父进程的代码处继续执行&#xff0c;但具有不同的进程 ID。 fork() …...

耀圣控制设备有限公司:优质压滤机阀门的引领者

耀圣控制设备有限公司&#xff1a;优质压滤机阀门的引领者 在压滤机阀门领域&#xff0c;耀圣控制设备有限公司以其卓越的品质和领先的技术&#xff0c;成为了行业内备受瞩目的品牌。 耀圣控制设备有限公司专注于压滤机阀门的研发与生产&#xff0c;凭借着先进的工艺和严格的质…...

【C语言】结构体(四)

本篇重点是typedef关键字 一&#xff0c;是什么&#xff1f; typedef用来定义新的数据类型&#xff0c;通常typedef与结构体的定义配合使用。 简单来说就是取别名 ▶ struct 是用来定义新的数据类型——结构体 ▶ typedef是给数据类型取别名。 二&#xff0c;为什么&#xf…...

面向源代码的软件可信度量模型 T_{na}

面向源代码的软件可信度量模型 T n a T_{na} Tna​ 课程&#xff1a;软件质量分析 作业 可编写下面的java程序&#xff1a; package org.example;public class SourceCodeOrientedModel {public static void main(String[] args) {int total 41;int[] m {9, 22, 9, 5, 7, 1…...

Java11使用JVM同一日志框架启用日志记录

你可以使用-Xlog选项配置或启用Java虚拟机同一日志框架的日志记录。 -Xlog:gc*trace:file/Users/xx/gc-%t.log:time,tags,level,pid,tid,hostname,path:filecount3,filesize10K -Xlog:gc*trace:stdout:time,tags,level,pid,tid,hostname:filecount3,filesize10K -Xlog:gc*trac…...

k8s容器存储接口 CSI 相关知识

容器存储接口 CSI 相关知识 参考&#xff1a; https://blog.csdn.net/lovely_nn/article/details/122880876 https://developer.aliyun.com/article/783464 https://www.cnblogs.com/varden/p/15139819.html存储商需实现 CSI 插件的 NodeGetVolumeStats 接口&#xff0c;Kube…...

JDBC相关

请解释一下 JDBC 是什么&#xff1f; JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 语言访问数据库的标准 API。它提供了一套统一的接口&#xff0c;使得 Java 程序能够与各种不同的数据库进行交互。 请说明一下 JDBC 连接池的使用方法和优势。 使用方法…...

Github提交Pull Request教程 Git基础扫盲(零基础易懂)

1 PR是什么&#xff1f; PR&#xff0c;全称Pull Request&#xff08;拉取请求&#xff09;&#xff0c;是一种非常重要的协作机制&#xff0c;它是 Git 和 GitHub 等代码托管平台中常见的功能&#xff0c;被广泛用于参与社区贡献&#xff0c;从而促进项目的发展。 PR的整个过…...

【计算机网络】实验7:默认路由和特定主机路由以及路由环路问题

实验 7&#xff1a;默认路由和特定主机路由以及路由环路问题 一、 实验目的 了解默认路由以及特定主机路由。 了解静态路由配置错误导致的路由环路问题。 二、 实验环境 • Cisco Packet Tracer 模拟器 三、 实验内容 1、默认路由以及特定主机路由 (1) 第一步&#xff…...

RK3506 PINCTRL学习

引脚命名规则 Rockchip Pin 的 ID 按照 控制器 (bank) 端口 (port) 索引序号 (pin) 组成。 GPIO&#xff08;通⽤输⼊输出&#xff09; 控制器和GPIO控制器数量一致&#xff1b;端口固定A/B/C/D索引序号固定为0/1/2/3/4/5/6/7 每个控制器可以控制32个IO&#xff0c;作为GPIO功…...

NS4828 0.8A 线性同步移动电源管理芯片

1 特性 ● 内置固定 0.8A 的线性充电模式 ● 涓流/恒流/恒压三段式充电&#xff0c;支持 0V 电池充电 ● 充电输入端有防反灌功能&#xff0c;不需要防反灌二极管 ● 0.8A同步升压转换器 ● 同步放电固定 5.1V 输出 ● 双灯充放电 LED 灯指示 ● 支持自动负载检测 ● 双灯充电与…...

重生之学C++篇—算术操作符

一、算术操作符 在写代码的时候&#xff0c;一定会涉及到计算。为了方便运算&#xff0c;C提供了一系列的操作符&#xff0c;其中有一组操作符叫做算术操作符。分别是&#xff1a; 、 - 、 * 、 / 、 %&#xff0c;这些操作符都是双目操作符&#xff08;有两个操作数&#xff…...

人机交互革命,为智能座舱市场激战注入一针「催化剂」

从AIGC到AGI赋能&#xff0c;智能座舱人机交互体验迎来新范式。 不断训练、迭代的大模型&#xff0c;为智能座舱带来了更全面的感知能力、更准确的认知理解&#xff0c;以及更丰富的交互模态&#xff0c;显著提升了其智能化水平。 “AI大模型的快速应用与迭代&#xff0c;推动…...

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?“找不到mfc140u.dll文件”要怎么解决?教你几招轻松搞定

《只狼》运行时提示“mfc140u.dll文件缺失”的科普与解决方案 作为一名软件开发从业者&#xff0c;在游戏开发和维护过程中&#xff0c;我们经常会遇到各种运行时错误和系统报错。今天&#xff0c;我们就来探讨一下《只狼》这款游戏在运行时提示“mfc140u.dll文件缺失”的原因…...

VTK中矩阵vtkMatrix4x4类的介绍和使用

1、矩阵-齐次坐标介绍 常见的点一般是Pt&#xff08;X,Y,Z&#xff09;&#xff0c;相当于一个13矩阵&#xff0c;而矩阵相乘的话一般是第一个矩阵的列数要等于第二个矩阵的行数。此处需要引入齐次坐标的概念&#xff1a;从广义上讲&#xff0c;齐次坐标就是用n1维向量表示n 维…...

STM32的OTA

STM32的OTA&#xff08;Over-The-Air&#xff09;是一种通过无线通信方式&#xff0c;为设备分发新软件、配置甚至更新加密密钥的技术。以下是对STM32 OTA的详细介绍&#xff1a; 一、OTA升级概述 OTA升级允许中心位置向所有用户发送更新&#xff0c;确保每个接收者都无法拒绝…...

【超图】iClient3D for Cesium 以动静结合方式加载WMTS服务

作者&#xff1a;taco 一、问题来源 在最近支持的项目中&#xff0c;我们面临一个挑战&#xff1a;客户需要在前端动态加载高达3亿级别的白模底面数据。这样做的主要原因是客户的数据库会频繁更新&#xff0c;因此我们需要采用动态加载的方式来确保用户界面能够实时反映最新的…...

2.STM32通信接口之SPI通信---SPI实战《精讲》

SPI仅支持一主多从&#xff08;无应答机制&#xff09; 参照&#xff1a;《第十一部分》1.STM32通信接口之SPI通信---SPI介绍《精讲》-CSDN博客 在采用一主多从的模式下。从机未被选中&#xff0c;SN1时&#xff0c;从机的MISO会处于高阻态状态&#xff0c;SN0时&#xff0c;M…...

WangEditor — 一个轻量级富文本编辑器

官网&#xff1a;https://www.wangeditor.com/ 介绍 在现代 Web 开发中&#xff0c;富文本编辑器是一个常见的工具&#xff0c;它允许用户输入、编辑和格式化内容。在众多富文本编辑器中&#xff0c;WangEditor 是一个轻量级、高效且易于使用的选择。它支持 HTML 格式的内容编…...

Redis 之持久化

目录 介绍 RDB RDB生成方式 自动触发 手动触发 AOF&#xff08;append-only file&#xff09; Redis 4.0 混合持久化 Redis主从工作原理 总结 介绍 Redis提供了两个持久化数据的能力&#xff0c;RDB Snapshot 和 AOF&#xff08;Append Only FIle&#xff09;…...

Scala的模式匹配

package hfdobject Test34 {def main(args: Array[String]): Unit {//身份证val id "429005202023210042"// val id "319005202023210042"// val id "119005202023210042"//val id "339005202023210042"//截取前两位val pre id.sub…...

学习笔记052——Spring Boot 自定义 Starter

文章目录 Spring Boot 自定义 Starter1、自定义一个要装载的项目2、创建属性读取类 ServiceProperties3、创建 Service4、创建自动配置类 AutoConfigration5、创建 spring 工程文件6、将项目打成 jar 包7、jar 打包到本地仓库8、配置application.yml Spring Boot 自定义 Starte…...

react学习记录Day2

Materal UI组件 1、Typography 文字铸排 使用文字铸排可以尽可能清晰、高效地展示您的设计和内容。 2、useTranslation 在React应用程序中&#xff0c;国际化&#xff08;i18n&#xff09;通常是通过使用专门的库来实现的&#xff0c;其中一个流行的库是react-i18next。这个…...

4. STM32_定时器

概述 什么是定时器&#xff1a; 定时器核心就是计数器&#xff0c;是使用精准的时基&#xff0c;通过硬件的方式&#xff0c;实现定时功能的器件。 定时器的工作原理&#xff1a; 主频时钟CLK通过PSC进行分频后产生定时器时钟TIM CLK&#xff0c;计数器CNT根据TIM CLK的频率…...

JMeter中获取随机数、唯一ID、时间日期(包括当前日期增减)截取指定位数的字符等

在JMeter中&#xff0c;您可以使用内置的函数和一些额外的插件来获取随机数、唯一ID、时间日期以及截取指定位数的字符。以下是一些常用的方法&#xff1a; 获取随机数&#xff1a; 使用__Random函数&#xff0c;您可以在指定的最小值和最大值之间生成一个随机数。例如&#xf…...

Windows下从命令行(Powershell/CMD)发送内容到系统通知中心

Windows下从命令行&#xff08;Powershell/CMD&#xff09;发送内容到系统通知中心 01 前言 在平时写脚本的时候&#xff0c;将日志等信息直接输出到控制台固然是最直接的&#xff0c;而如果是一些后台执行的任务&#xff0c;不需要时刻关注运行细节但是又想知道一些大致的情…...

day01-搭建项目环境

1. 项目介绍 1.1 项目亮点 1.2 技术架构 2. 搭建环境 启动老师提供的虚拟机&#xff0c;里面常用的组件是开机启动的。 本地访问一些组件时需要手动敲写ip地址和组件端口&#xff0c;在本地的host文件中添加虚拟机的地址&#xff0c;而且虚拟机中有nginx反向代理&#xff0c…...

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载&#xff0c;已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd&#xff0c;键入rustc --version&#xff0c;出现 rust 版本号&…...

MySQL 函数创建中的 Err 1418:原因解析与解决指南20241203

&#x1f6a8; MySQL 函数创建中的 Err 1418&#xff1a;原因解析与解决指南 &#x1f4d6; 引言 在使用 MySQL 创建函数时&#xff0c;许多开发者会偶然遇到如下报错&#xff1a; [Err] 1418 - This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its…...

GPT 1到4代的演进笔记

1. GPT-1 标题是 Improving Language Understanding by Generative Pre-Training. 发表于 2018.02, 比 bert(发布于 2018.10) 早了半年. 1.1 动机 困难:NLU 任务是多样的, 有 {textual entailment, question answering, semantic similarity assessment, document classifica…...

Zookeeper集群数据是如何同步的?

大家好&#xff0c;我是锋哥。今天分享关于【Zookeeper集群数据是如何同步的?】面试题。希望对大家有帮助&#xff1b; Zookeeper集群数据是如何同步的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Zookeeper集群中的数据同步是通过一种称为ZAB&#xff08;Zo…...

vue初始化脚手架

Vue初始化脚手架是指使用Vue CLI&#xff08;Command Line Interface&#xff09;工具来创建一个Vue项目的基础结构。Vue CLI是Vue.js官方提供的一个脚手架工具&#xff0c;它可以帮助开发者快速搭建Vue项目的基本框架&#xff0c;包括目录结构、配置文件、依赖管理等。 1. 初始…...

可编程网络在分布式深度学习通信瓶颈控制中的应用与未来展望

目录 可编程网络技术解决分布式深度学习通信瓶颈 1. 网络内聚合原语加速分布式深度学习 2. 流聚合与网络内数据处理设计 3. 可编程数据平面加速 4. 降低通信发生的频次 5. 使用大批量进行训练 可编程网络 可编程性定义 在大语言模型中的应用 举例说明: 可编程网络在…...

【教学类-43-25】20241203 数独3宫格的所有可能-使用模版替换(12套样式,空1格-空8格,每套510张,共6120小图)

前期做数独惨宫格的所有排列&#xff0c;共有12套样式&#xff0c;空1格-空8格&#xff0c;每套510张&#xff0c;共6120小图&#xff09; 【教学类-43-24】20241127 数独3宫格的所有可能&#xff08;12套样式&#xff0c;空1格-空8格&#xff0c;每套510张&#xff0c;共6120…...

组合问题变式——选数(dfs)

代码随想录听课笔记1——回溯算法-CSDN博客 这是从1&#xff0c;2&#xff0c;3...,n个数字中选出k个数的组合&#xff0c;输出组合的全部可能的代码 //组合&#xff1a;返回1-n中所有个数为k的组合 1,2,3,4 #include<bits/stdc.h> using namespace std; #define MAX 1…...

怎麼解決路由器IP地址衝突?

路由器IP地址衝突通常發生在網路中有兩個設備嘗試使用相同的IP地址時。這種衝突會導致網路連接問題&#xff0c;因為每個設備需要一個唯一的IP地址才能正常通信。 1. 重啟設備 重啟路由器和設備&#xff1a;有時候簡單的重啟可以解決問題&#xff0c;設備重新獲取一個新的IP地…...

【Flink】Flink 作业执行大致流程

Flink 作业执行流程 (Application 模式) 客户端通过 ClusterDescriptor 提交 Application 模式 Sql 任务到服务端&#xff0c;服务端调用作业时 StreamTableEnvironment 使用 FlinkSqlParser 将 SQL 转换为 Operation , StreamTableEnvironment 转换 SQL 过程中使用 CatalogSou…...

mdf文件数据处理之画图(subplots多信号展示同一张图中)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

python基础知识(一)

文章目录 基础语法注释多行语句数字(Number)类型字符串(String)字符串常用方法字符串格式化 import与from...import 基本数据类型多个变量赋值标准数据类型 运算符算术运算符赋值运算符逻辑运算符成员运算符身份运算符 基础语法 注释 python注释可以使用#&#xff0c;或者三个…...

解决 Flutter Dio合并请求多个接口,如果一个接口500,那么导致其他请求不在执行

Flutter Dio如何自定义拦截异常 应用场景 我们一般会统一拦截DioExceptionType 如400&#xff0c;403&#xff0c;500 等错误 但有时候&#xff0c;有个地方合并请求多个接口&#xff0c;如果一个接口500&#xff0c;那么导致其他请求不在执行&#xff0c;因为统一拦截了500&…...

RPC一分钟

概述 微服务治理&#xff1a;Springcloud、Dubbo服务通信&#xff1a;Grpc、Trift Dubbo 参考 Dubbo核心功能&#xff0c;主要提供了&#xff1a;远程方法调用、智能容错和负载均衡、提供服务自动注册、自动发现等高效服务治理功能。 Dubbo协议Dubbo支持dubbo、rmi、http、…...

CentOS 7 docker部署jar包

1、创建Dockerfile vim Dockerfile2、编辑内容 # 基础镜像 FROM openjdk:8 # 作者或联系方式 MAINTAINER wq # test为别名 ADD erp-1.0.jar /test.jar # 容器暴露端口 EXPOSE 8081 ENTRYPOINT ["java","-jar","test.jar"]3、生成镜像 docker …...

高性能mysql 1

高性能mysql 1 参考&#xff1a; 博客 https://segmentfault.com/a/1190000040374142书籍&#x1f4da;’High performance mysql’ ​ I note some hard part ,translating it into Chinese for a better comprehensionsometimes when I have some trouble with reading En…...

QT发布ArcGIS QML项目时遇到的问题

在打包 ArcGIS Runtime SDK for Qt 项目时&#xff0c;如果项目中没有正确显示地图或者图层&#xff0c;且在项目的 DLL 依赖中没有找到与 ArcGIS SDK 相关的依赖&#xff0c;可能是由于以下几种原因导致的&#xff1a; 1. 未正确配置 ArcGIS SDK 的依赖 ArcGIS Runtime SDK …...

高校数字化运营平台解决方案:构建统一的服务大厅、业务平台、办公平台,助力打造智慧校园

教育数字化是建设教育强国的重要基础&#xff0c;利用技术和数据助推高校管理转型&#xff0c;从而更好地支撑教学业务开展。 近年来&#xff0c;国家多次发布政策&#xff0c;驱动教育行业的数字化转型。《“十四五”国家信息化规划》&#xff0c;推进信息技术、智能技术与教育…...

cocotb value cocotb—基础语法对照篇

cocotb—基础语法对照篇 import cocotb from cocotb.triggers import Timer from adder_model import adder_model from cocotb.clock import Clock from cocotb.triggers import RisingEdge import randomcocotb.test() async def adder_basic_test(dut):"""Te…...