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

【Linux】管道通信和 system V 通信

文章目录

  • 一、进程通信原理(让不同进程看到同一份资源)
  • 二、管道通信
    • 2.1 管道原理及其特点
    • 2.1 匿名管道和命名管道
  • 三、共享内存通信
    • 3.1 共享内存原理
    • 3.2 创建和关联共享内存
    • 3.3 去关联、ipc 指令和删除共享内存
  • 四、消息队列和信号量(了解)
    • 4.1 消息队列
    • 4.2 信号量
    • 4.3 system V

一、进程通信原理(让不同进程看到同一份资源)

  尽管每个进程在其独立的地址空间中运行,它们之间并没有直接共享的内存区域,但所有进程都共享同一个OS操作系统。这个共享的操作系统会提供相应的进程通信机制,如共享内存、消息传递、信号、管道、套接字等。这些机制允许进程间实现数据的转发和共享,即便它们在内存中没有直接共享的空间。
  因此,进程通信(Inter-Process Communication, IPC)的原理就是:操作系统是所有进程共享的第三方实体,为进程提供了一套丰富的通信工具和协议,使得进程能够在保持独立性的同时,又让不同的进程看到同一份资源!!!以此实现数据的共享和任务的协调。这种设计不仅提高了系统的稳定性和效率,还确保了通信的安全性和有效性,能够管理了进程间的同步和互斥,防止数据在传输过程中发生冲突。

二、管道通信

2.1 管道原理及其特点

  我们把从一个进程连接到另一个进程的一个数据流称为一个 管道,这个数据流就是一段内核缓冲区,默认大小为 4kb,会根据实际情况做适当的调整。也可以叫做伪文件,不会刷新到磁盘。管道的操作形式是基于文件的,它只允许单向通信,如果要双向通信的话,需要建立两个管道,“互相读写”!

管道通信时可能会遇到以下四种情况:

  • 1、读写端正常,管道如果为空,读端就要阻塞
  • 2、读写端正常,管道如果被写满,写端就要阻塞
  • 3、读端正常读,写端关闭,读端就会读到0,表明读到了文件(pipe)结尾,不会被阻塞
  • 4、写端正常写,读端关闭了。操作系统就要向目标文件发送 SIGPIPE(13) 信号,杀掉正在写入的进程


管道通信特点:

  • 1、管道是基于文件的,且文件生命周期是跟随进程的
  • 2、为了保护管道文件的数据安全,进程之间需要进行进程协同,同步与互斥
  • 3、匿名管道,仅允许有血缘关系的进程(常用于父子)进行通信,且是单向通信的
  • 4、是面向字节流的(面向字节流读取, 跟写的时候的格式无关, 读取的时候只跟字节数有关)

2.1 匿名管道和命名管道

匿名管道:int pipe(int pipefd[2]);
  pipefd 数组是一个输入输出型参数,创建成功返回 0,创建失败返回 -1,并设置错误码!pipefd[0] 表示读端文件描述符,pipedf[1] 表示写端文件描述符。匿名管道,只允许有血缘关系的进程之间进行进程间通信,管道是单向通信的,在我们 fork 之后,应让父子进程中的一方写入,另外一方读取。

命名管道:int mkfifo(const char *pathname, mode_t mode);
  创建成功返回 0,失败返回 -1,并设置错误码,参数 pathname 为文件名, mode 是其对应的权限 。命名管道是一种进程间通信机制,它和匿名管道的区别是,它可以让没有血缘关系的进程进行通信。同时命名管道有对应的 inode ,可以理解为磁盘上的伪文件。但它不是一个实际的数据存储文件,无论写入多少数据,其大小都是 0
  命名管道通过路径+文件名作为该文件的唯一标识,用法和普通文件一样,使用 open、write、read 接口,但仍得保持其单向通信的特性,一端读取,一段写入。且需要等待写端打开之后,读端才会打开文件,否则读端会阻塞等待。

三、共享内存通信

3.1 共享内存原理

  共享内存(Shared Memory)是进程间通信的一种方式,它允许两个或多个进程访问同一块物理内存区域。每个进程都有自己的虚拟地址空间,共享区存在于地址空间上的栈区和堆区之间。在用户需要申请共享内存时,操作系统在物理内存中申请一块空间,每个进程在自己的共享区中与这块物理内存单独建立页表映射,这种多个进程共同映射同一块物理内存的操作就叫做共享内存(即让不同的进程,看到同一份资源)
  这些进程可以通过共享区页表映射直接读写这块物理内存,如同访问本进程的私有内存一样,进行数据交互。因此,它是内存级别的通信,没有额外的复制开销,使得通信速度非常快。但由于有多个进程访问同一块空间,也得考虑同步和互斥控制,我们可以通过使用管道、条件变量、消息队列、信号量,加锁等方法来避免竞态条件和数据不一致的问题。

3.2 创建和关联共享内存

从不同角度上来理解实现共享内存的步骤:
操作系统角度:
①创建共享内存
②删除共享内存
进程角度:
③关联共享内存
④去关联共享内存
因此我们需要按①③④②顺序区管理一个共享内存

创建共享内存 int shmget(key_t key, size_t size, int shmflg);
  创建成功返回 shmid,失败返回 -1 ,错误码被设置。size 为要申请的共享内存大小,由于操作系统对内存管理的最小单位是页(4KB),所以 size 建议设置成为页的整数倍。

shmflg为创建共享内存的选项,常见的有两个选项:

  • IPC_CREAT:创建共享内存,不存在,就创建,存在,就获取
  • IPC_EXCL:不单独使用,必须和IPC_CREAT配合使用。如果不存在指定的共享内存,就创建。存在,则出错返回。这样可以保证,如果shmget函数调用成功,一定是一个全新的共享内存。
  • 并且 shmflg 可以按位或文件权限,设置共享内存权限,类似shmget(key,SIZE,flags | 0666);

现在关键的问题来了,你怎么保证不同的进程看到的是同一个共享内存呢?
  操作系统中可能有很多个共享内存在被使用,所以我们就需要用一个唯一值来标识每一个共享内存,即 key 值。在内核中,让不同的进程看到同一份共享内存,让他们拥有同一个 key 即可。

那么这个 key 由谁来提供呢?
  如果由操作系统来提供,那么创建共享内存的进程可以知道 key 值,但是其它要使用这个共享内存的进程如何获取这个 key 呢,不可能让创建共享内存的进程通信给他们吧。因为此时你要解决的就是双方通信的问题,这就变成了鸡生蛋、蛋生鸡的问题。所以 key 值必须由用户之间指定、用户之间的约定的,这样才能确保看到的是同一个共享内存。

获取 key 值:key_t ftok(const char *pathname, int proj_id);
  将文件路径和一个项目标识符,通过一套算法转化为唯一 key 值,这里的路径名和项目标识符就是用户之间约定好的,成功返回一个唯一的 key 值,失败返回 -1,错误码被设置。

  创建共享内存成功返回共享内存标识符 shmid ,它是一个由系统分配的唯一的整数值,用于唯一标识一个共享内存段。key 在操作系统内标定唯一性,而shmid 只在你的进程内,用来表示资源的唯一性!!!接下来的对共享内存的操作(关联、去关联、删除)我们都采用 shmid 作为参数而非 key

关联共享内存:void *shmat(int shmid, const void *shmaddr, int shmflg);

参数:

  • shmid:共享内存标识符,由 shmget 函数返回
  • shmaddr:指定附加共享内存的位置。如果设置为 NULL,则由系统选择地址
  • shmflg:控制共享内存的访问方式和其他选项的标志,一般设置为0使用默认行为

  成功返回附加到进程地址空间的共享区的地址。失败,返回 (void *) -1,错误码被设置。使用类似于 molloc,使用时需要强转为需要的指针类型。对此我们就像访问自己的私有内存一样,与其它进程进行数据交互通信

3.3 去关联、ipc 指令和删除共享内存

去关联共享内存:int shmdt(const void *shmaddr);
  成功返回0,失败返回-1,错误码被设置。参数为共享区中 shmat 函数返回的共享区起始地址

ipc 系列相关指令:
一、查看IPC

  • ipcs 和 ipcs -a : 查看所有IPC对象
  • ipcs -q: 查看消息对列对象
  • ipcs -m: 查看共享内存对象
  • ipcs -s: 查看信号量对象

二 、删除 IPC 对象

  • ipcrm -Q key :根据键值key,删除指定的消息对列
  • ipcrm -q id:根据ID,删除指定的消息对列
  • ipcrm -M key:根据键值key,删除指定的共享内存
  • ipcrm -m id:根据ID,删除指定的共享内存
  • ipcrm -S key :根据键值key,删除指定的信号量
  • ipcrm -s id:根据ID,删除指定的信号量

删除共享内存:int shmctl(int shmid, int cmd, struct shmid_ds *buf);

参数:

  • shmid:由 shmget 函数返回的共享内存标识码
  • cmd:将要采取的动作,IPC_STAT:提取 shmid_ds 结构中的数据;IPC_SET:设置 shmid_ds 结构中的数据;IPC_RMID:删除共享内存
  • buf:指向一个保存着共享内存的模式状态和访问权限的数据结构

  毋庸置疑,共享内存可能存在多个必然是要先描述后组织起来的,shmid_ds 就是描述共享内存的结构体。它包括共享内存的大小、创建者和最后操作者的进程ID、当前有多少进程附加到这个共享内存段等属性。顺着往下找,其结构体内部的结构体 ipc_perm 中,就保存了由用户提供的 key 值。

四、消息队列和信号量(了解)

4.1 消息队列

  消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法,读端和写端公用一个队列。当发送方有数据发送时,将数据先打包成一个节点,然后尾插到内核中的消息队列中去。当接收方接收数据时,从队列头部开始去找所需要的节点,然后进行解包得到数据。同时每个数据块都会有个记录类型的数据,来判断该数据块该被哪个进程读取。

消息队列接口:使用几乎和共享内存一样,这里就不详细介绍了
获取:int msgget(key_t key, int msgflg);
控制:int msgctl(int msqid, int cmd, struct msqid_ds *buf);
发送:int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
接受:ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

4.2 信号量

信号量:
  信号量本质上就是个计数器,它统计的是公共资源资源的剩余量。而公共资源可以被多个进程同时访问,如果访没有同步与互斥,就会导致数据不一致问题(一个进程还在写的时候另一个进程就开始读)。而这种通过同步与互斥被保护起来的资源称为临界资源,访问临界资源的那部分代码称为临界区,其他的代码就称为非临界区。
互斥:当有多个执行流想要访问同一份资源的时候,我们只允许一个执行流进行访问,当这个执行流访问完了,下一个执行流能访问
  进程在访问公共资源前要先申请信号量,需要让多个进程看到同一个计数器,避免资源不足而访问失败。看到同一个计数器说明信号量也是个公共资源,也需要保护,因此对信号量的 pv 操作必须是原子的
P 操作:申请信号量,计数器减 1
V 操作:释放信号量,计数器加 1

原子性:要么不做,要么做完,只有这两种状态的情况

4.3 system V

  进程间通信除了通过管道,都是基于文件的通信方式,还有一种方式是:System V 标准的进程间通信方式。System V 标准是一个在OS层面专门为进程通信设计的一个方案,它是被精心设计过的。system V IPC 提供的通信方式有三种: 共享内存、消息队列和信号量,你可以发现它们的系统调用接口都非常相似,同时它们都有描述自己字段的结构体 xxx_ds。而在它们的 xxx_ds 结构体中,开头都有一个共同的字段 ipc_perm,这个 ipc_perm 类似于基类,被其它子类继承下去

	struct ipc_perm {key_t          __key;    /* Key supplied to shmget(2) */uid_t          uid;      /* Effective UID of owner */gid_t          gid;      /* Effective GID of owner */uid_t          cuid;     /* Effective UID of creator */gid_t          cgid;     /* Effective GID of creator */unsigned short mode;     /* Permissions + SHM_DEST and  SHM_LOCKED flags */unsigned short __seq;    /* Sequence number */};

  因为它们的第一个字段 ipc_perm 是一样的,所以可以维护一个 struct ipc_perm* 的指针数组,存共享内存、消息队列、信号量它们三者中,第一个元素的地址,也就是 &ipc_perm。这样就可以把共享内存、消息队列和信号量三个部分直接管理起来了。而我们知道结构体的第一个成员的地址和结构体对象的地址在数值上是相同的,并且操作系统在内部可以识别这个对象是共享内存、消息队列和信号量中的哪一个,因此我们拿到这个数组中的 ipc_perm 地址便能访问这结构体的其它成员,将它们管理起来

相关文章:

【Linux】管道通信和 system V 通信

文章目录 一、进程通信原理(让不同进程看到同一份资源)二、管道通信2.1 管道原理及其特点2.1 匿名管道和命名管道 三、共享内存通信3.1 共享内存原理3.2 创建和关联共享内存3.3 去关联、ipc 指令和删除共享内存 四、消息队列和信号量(了解&am…...

Python | Leetcode Python题解之第279题完全平方数

题目: 题解: class Solution { public:// 判断是否为完全平方数bool isPerfectSquare(int x) {int y sqrt(x);return y * y x;}// 判断是否能表示为 4^k*(8m7)bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7;}int numSquares(i…...

mysql定时备份

为什么写这篇文章 最近项目里面需要定时备份mysql的数据,网上找了下,找到了一些比较好的解决方案。但是发现有几个地方与自己不匹配,我期望有如下 备份过程不能锁表,网上很多都是会锁表备份定时任务无法执行,但是手动…...

数据结构:逻辑结构与物理结构

逻辑结构与物理结构 逻辑结构1. 集合结构2. 线性结构3. 树形结构4. 图形结构 物理结构1. 顺序存储结构2. 链式存储结构 示例逻辑结构的示例:线性表物理结构的示例 结论 逻辑结构 逻辑结构描述了数据元素之间的逻辑关系,它是数据结构的抽象描述&#xff…...

pycharm报错:No module named pip/No module named pytest

1、问题概述? 今天在执行一个python脚本的时候,控制台提示:No module named pytest,就是没有pytest模块,于是我使用pip命令进行安装,命令如下; pip install pytest 结果又提示No module named pip,说我没有pip模块,没办法,再安装pip 2、安装pip-方式1 在pycharm的T…...

Linux:Linux权限

目录 1. Linux权限的概念 2. Linux权限管理 2.1 文件访问者的分类 2.2 文件类型和访问权限 2.2.1 文件类型 2.2.2 基本权限 2.3 文件权限值的表示方法 2.4 文件访问权限的相关设置方法 2.4.1 chmod 2.4.2 chown 2.4.3 chgrp 2.4.4 umask 3. file指令 4. Linux目…...

新版Glide检测生命周期原理

本文章使用的是glide 4.15.1 public class RequestManagerRetriever implements Handler.Callback {rivate final LifecycleRequestManagerRetriever lifecycleRequestManagerRetriever;public RequestManagerRetriever(Nullable RequestManagerFactory factory, GlideExperim…...

Ansible的脚本-----playbook剧本【上】

目录 1.playbook剧本组成 2.playbook剧本实战演练 2.1 实战演练一:给被管理主机安装httpd服务 2.2 实战演练二:定义、引用变量 2.3 实战演练三:指定远程主机sudo切换用户 2.4 实战演练四:when条件判断 2.5 实战演练五&…...

sql注入学习与防护

一、SQL注入分类 SQL注入根据攻击方式的不同,可以分为以下几种类型: 数字型注入字符型注入报错注入布尔盲注时间盲注联合查询注入基于堆叠的查询注入 二、SQL注入流程 发现注入点猜测字段数确定显示字段获取数据库信息获取数据库中的表获取表中的字段获…...

饥荒dst联机服务器搭建基于Ubuntu

目录 一、服务器配置选择 二、项目 1、下载到服务器 2、解压 3、环境 4、启动面板 一、服务器配置选择 首先服务器配置需要2核心4G,4G内存森林加洞穴大概就占75% 之后进行服务器端口的开放: tcp:8082 tcp:8080 UDP:10888 UDP:10998 UDP:10999 共…...

AtCoder Beginner Contest 363

A - Piling Up 题意 不同的分数段有不同的^数量,Takahashi想要使得他的^数量增加,问他所需要的最少分数增幅。 思路 我们只需要找到下一阶段的下限。 a / 100 是本阶段 1 变成下一阶段,再 * 100变成下限,再与原来的相减即可…...

Protel DXP 面试题详解及参考答案(4万字长文)

解释Protel DXP的基本工作流程。 Protel DXP(现已更名为Altium Designer)是一款用于电子设计自动化(EDA)的软件,主要应用于印刷电路板(PCB)设计。其基本工作流程通常包括以下几个阶段: 项目创建与配置: 开始一个新的设计项目时,首先需要创建一个项目文件,在这个文件…...

雪花算法 集群uid重复问题 uid-generator-spring-boot-starter

1、在生成环境 在某个业务使用该插件生成uid,由于业务整合了 mybatis-plus模块 2、该业务是分部署集群部署以及使用的多线程获取uid,使用中发现唯一建冲突,生成的uid有重复。 然后查看日志发现 workerId 始终为0 怀疑是生成workerId出了问题。 查看跟…...

【AutoDL】AutoDL+Xftp+Xshell+VSCode配合使用教程

身边没有显卡资源或不足以训练模型时,可以租赁服务器的显卡。 1、AutoDL Step :注册账号->选择显卡->选择环境->开机启动 1.1 首先打开AutoDL官网,注册账号 1.2 租赁自己想要的显卡资源 1.3 选择基础环境。 此处,我们让其自动配置…...

使用minio cllient(mc)完成不同服务器的minio的数据迁移和mc基本操作

minio client 前言使用1.拉取minio client 镜像2.部署mc容器3.添加云存储服务器4.迁移数据1.全量迁移2.只迁移某个桶3.覆盖重名文件 5.其他操作1.列出所有alias、列出列出桶中的文件和目录1.1.列出所有alias1.2.列出桶中的文件和目录 2.创建桶、删除桶2.1.创建桶2.2.删除桶 3.删…...

Vue3分段控制器(Segmented)

效果如下图:在线预览 APIs Segmented 参数说明类型默认值必传block是否将宽度调整为父元素宽度,同时所有选项占据相同的宽度booleanfalsefalsedisabled是否禁用booleanfalsefalseoptions选项数据string[] | number[] | SegmentedOption[][]falsesize控…...

SpringSecurity如何正确的设置白名单

在SpringSecurity中,往往需要对部分接口白名单访问,而大部分在使用Security中就有一个误区,那就是免鉴权访问和白名单的区别。 大部分的Security文章包括官方文档给出免鉴权访问都是使用.permitAll()去对相应路径进行免鉴权访问,但实际上这仅仅只表示该资源不需要相应的权限访问…...

【Langchain大语言模型开发教程】评估

🔗 LangChain for LLM Application Development - DeepLearning.AI 学习目标 1、Example generation 2、Manual evaluation and debug 3、LLM-assisted evaluation 4、LangChain evaluation platform 1、引包、加载环境变量; import osfrom dotenv imp…...

Python爬虫小项目实战

1.自动获取小说多个章节内容 2.获取英雄联盟里面的全部英雄 3. 简单地自动抽奖系统 4. 简单地点赞系统 5. 制作查询手机号工具 6. 制做登录系统 7. 操作excel办公自动化 8. 自动批量保存图片 9. 获取NBA数据 10. 获取彩票信息 11. 获取房地产信息 12. 获取小说…...

PHP Filesystem 简介

PHP Filesystem 简介 PHP 是一种广泛使用的开源服务器端脚本语言,特别适用于网页开发。在 PHP 中,Filesystem 是一个功能丰富的库,提供了一系列用于文件系统操作的函数。这些函数允许开发者读取、写入、修改和删除文件和目录,以及执行其他与文件系统相关的任务。 PHP Fil…...

源代码加密软件哪家好?五款企业级加密软件推荐

随着软件开发行业的快速发展,源代码作为核心资产,面临着越来越大的安全威胁。保护源代码不被泄露或盗用,是每个开发团队和企业都需要高度重视的问题。源代码加密软件通过对代码进行加密处理,确保其在传输和存储过程中保持机密性。…...

Redis常见的数据类型及操作方式

一、通用命令 1)获取redis中所有key keys * 2)删除一个或多个key del key1 key2 ... 3)判断key是否存在 exists key 4)给key添加过期时间 expire key time 5)查看key剩余过期时间 ttl key 6) 查看redis内存…...

谷粒商城实战笔记-55-商品服务-API-三级分类-修改-拖拽数据收集

文章目录 一,拖拽后结点的parentCid的更新二,拖拽后结点的父节点下所有结点的sort排序属性的变化更新排序的逻辑代码分析 三,拖拽后结点及其子节点catLevel的变化判断是否需要更新 catLevel获取拖动后的新节点 更新 catLevel完整代码 这一节的…...

AI绘画入门实践|Midjourney:使用 --seed 制作情侣头像与漫画

在 Midjourney 中,seed 是指一个种子,用于生成图像时的起点或基础。 使用格式:--seed 获取的seed值 获取 seed 值 使用 seed 生成图像 a cute boys avatar, background with blue sky and white cloud, Ghibli Studio style, Hayao Miyazaki…...

笔记:Enum中FlagsAttribute特性的用法

一、目的:分享Enum中FlagsAttribute特性的用法 在C#中,Enum(枚举)类型可以使用[Flags]属性来表示一个枚举可以存储多个值。这是通过按位运算符(如|(或)和&(与)&#…...

QWidget如何切换ui

在Qt中,QWidget及其子类用于构建图形用户界面。如果你想要在不同的UI之间切换,可以使用QStackedWidget,它可以管理一组QWidget,并且每次只显示其中一个。 以下是一个简单的例子,展示如何使用QStackedWidget切换UI&…...

web网站组成

web网站由四部分组成:浏览器 前端服务器 后端服务器 数据库服务器 流程: 1.浏览器输入网站后,向前端服务器发送请求,前端服务器响应,静态的数据给浏览器。 2.前端代码中script中有url,这个是向后台发送请求的网…...

带您详细了解安全漏洞的产生和防护

什么是漏洞? 漏洞是 IT、网络、云、Web 或移动应用程序系统中的弱点或缺陷,可能使其容易受到成功的外部攻击。攻击者经常试图寻找网络安全中的各种类型的漏洞来组合和利用系统。 一些最常见的漏洞: 1.SQL注入 注入诸如 SQL 查询之类的小代…...

【接口测试】params传参与body传参区别

文章目录 一.params传参二.body传参三.两者区别说明 一.params传参 params传参一般用于get请求 params传参时,参数会附于URL后面以问号形式展示。 示例: http://ip地址:端口号/login?usernamexm&pwd111二.body传参 body传参一般用于post请求 body传参时需…...

【docker】部署证书过期监控系统mouday/domain-admin

证书过期了再去部署证书容易被骂,就找了一个开源的证书过期系统来部署一下 过程 官方文档:https://domain-admin.readthedocs.io/zh-cn/latest/manual/install.html#docker 直接下载镜像是超时的,切换一下文档推荐的镜像源 新建docker配置…...

高级java每日一道面试题-2024年7月17日

面试官: java中都有哪些引用类型? 我回答: 强引用(Strong Reference) 描述:这是最常见和最直观的引用类型,我们通常在代码中创建的对象引用就是强引用。例如,Object obj new Object();。只要强引用存在,…...

css中如何清除浮动

在CSS中,可以使用clear:both属性来清除浮动。以下是几种常见的清除浮动的方法: 使用clearfix类:在CSS中定义一个clearfix类,并将其应用于需要清除浮动的父元素上。 .clearfix::after {content: "";display: table;cle…...

【网络】tcp_socket

tcp_socket 一、tcp_server与udp_server一样的部分二、listen接口(监听)三、accept接收套接字1、为什么还要多一个套接字(明明已经有了个socket套接字文件了,为什么要多一个accept套接字文件?)2、底层拿到新…...

Live555源码阅读笔记:哈希表的实现

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

vue3创建vite项目

一、创建vue3 vite项目: 命令行创建:npm create vitelatest vue3-tdly-demo -- --template vue (1)先进入项目文件夹,cd vue3-tdly-demo (2)之后执行, npm install (3)最后运行,npm run dev 将main.js文件内容改成…...

Maven概述

目录 1.Maven简介 2.Maven开发环境搭建 2.1下载Maven服务器 2.2安装,配置Maven 1.配置本地仓库地址 2.配置阿里云镜像地址 2.3在idea中配置maven 2.4在idea中创建maven项目 3.pom.xml配置 1.项目基本信息 2.依赖信息 3.构建信息 4.Maven命令 5.打包Jav…...

Easyu中datagrid点击时获取所在行的数据

问题 双击单元格时,获取该行的记录内容 $(#list).datagrid({method: post,url: user/list,queryParams:{sex : "f",age : "18~25"},fitColumns: true,pageList: [ 5, 10, 15, 20 ],singleSelect: false,pagination: true,fit: true,rownumber…...

java项目中添加SDK项目作为依赖使用(无需上传Maven)

需求: 当需要多次调用某个函数或算法时,不想每次调用接口都自己编写,可以将该项目打包,以添加依赖的方式实现调用 适用于: 无需上线的项目,仅公司或团队内部使用的项目 操作步骤: 以下面这…...

区块链和数据要素融合的价值及应用

一、数据要素面临的关键障碍 在构建数据要素基石的过程中,首要任务是明确并解决产权架构的难题,特别是使用权的确立与流转机制的顺畅,此乃数字经济蓬勃发展的命脉所在。一个高效的数据流转体系对于激发数据潜能、加速经济发展及优化数据资源…...

以太坊的可扩展性危机:探索执行层的瓶颈

导读:以太坊执行层承担着交易处理、智能合约执行以及保持一致和安全状态的维护等工作。Fuel Labs 撰文解析了以太坊执行层的工作原理,及其在可扩展性方面的发展瓶颈和影响。 Fuel Labs: 执行是指在区块链上执行交易和执行状态更改所需的计算。此计算通常…...

静态解析activiti文本,不入库操作流程

说明&#xff1a; activiti本身状态存库&#xff0c;导致效率太低&#xff0c;把中间状态封装成一个载荷类&#xff0c;返回给上游&#xff0c;下次请求时给带着载荷类即可。 1.pom依赖 <dependency><groupId>net.sf.json-lib</groupId><artifactId>js…...

100个python的基本语法知识【上】

0. 变量和赋值&#xff1a; x 5 name “John” 1. 数据类型&#xff1a; 整数&#xff08;int&#xff09; 浮点数&#xff08;float&#xff09; 字符串&#xff08;str&#xff09; 布尔值&#xff08;bool&#xff09; 2. 注释&#xff1a; # 这是单行注释 ""…...

Python从0到100(四十四):读取数据库数据

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...

ZLMRTCClient配置说明与用法(含示例)

webRTC播放视频 后面在项目中会用到通过推拉播放视频流的技术&#xff0c;所以最近预研了一下webRTC 首先需要引入封装好的webRTC客户端的js文件ZLMRTCClient.js 下面是地址需要的自行下载 http://my.zsyou.top/2024/ZLMRTCClient.js 配置说明 new ZLMRTCClient.Endpoint…...

nginx代理服务配置,基于http协议-Linux(CentOS)

基于http协议的nginx代理服务 1. 打开 Nginx 虚拟机80端口配置文件2. 添加代理配置3. 重启nginx服务 nginx代理缓存配置 1. 打开 Nginx 虚拟机80端口配置文件 Nginx 的默认80端口虚拟机配置文件通常位于/etc/nginx/conf.d/default.conf。 vim /etc/nginx/conf.d/default.con…...

Photos框架 - 自定义媒体资源选择器(数据部分)

引言 在iOS开发中&#xff0c;系统已经为我们提供了多种便捷的媒体资源选择方式&#xff0c;如UIImagePickerController和PHPickerViewController。这些方式不仅使用方便、界面友好&#xff0c;而且我们完全不需要担心性能和稳定性问题&#xff0c;因为它们是由系统提供的&…...

Spring Boot + Spring Cloud 入门

运行配置 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.activetest --my1.age32 --debugtrue "D:\Program Files\Redis\redis-server.exe" D:\Program Files\Redis\redis.windows.conf "D:\Program Files\Redis\redis-cli.exe" &q…...

怎么使用动态IP地址上网

如何设置动态IP地址上网&#xff1f; 设置动态IP地址上网的步骤如下&#xff1a; 一、了解动态IP地址 动态IP地址是由网络服务提供商&#xff08;ISP&#xff09;动态分配给用户的IP地址&#xff0c;它会根据用户的需求和网络情况实时改变。相比于静态IP地址&#xff0c;动态…...

【源码+文档+调试讲解】智慧物流小程序的设计与实现

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全…...

QT:控件圆角设置、固定窗口大小

实现控件圆角度设置//使用的是setStyleSheet方法 //改变的控件是QTextEdit&#xff0c;如果你想改变其他控件&#xff0c;将QTextEdit进行更换 this->setStyleSheet("QTextEdit{background-color:#FFFFFF;border-top-left-radius:15px;border-top-right-radius:15px;bo…...