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

【Linux系统】System V 的 IPC 机制在 Linux 系统中的实现

System V 的 IPC(Inter-Process Communication,进程间通信) 机制是 UNIX 系统中的一大特色,用于在不同进程之间共享数据或同步操作。Linux 系统完整实现了 System V 的 IPC 机制,并在其基础上进行了优化和扩展。这些机制包括 消息队列(Message Queues)信号量(Semaphores)共享内存(Shared Memory)

下面是 System V IPC 机制在现代 Linux 系统中的实现及其详细解析:

System V IPC 机制概述

System V IPC 提供了三种主要的进程间通信方式:

  1. 消息队列(Message Queues)
    • 提供一种进程间以消息为单位进行通信的方式。
    • 消息被存储在内核中,可以按优先级排序。
  2. 信号量(Semaphores)
    • 用于进程间的同步,控制对共享资源的访问。
    • 可以实现类似锁的功能,防止资源竞争。
  3. 共享内存(Shared Memory)
    • 提供直接在多个进程之间共享一段内存区域的能力。
    • 是 System V IPC 中最快的通信方式。
System V IPC 在 Linux 中的实现

1. 消息队列(Message Queues)
功能:① 消息队列允许一个进程向队列中写入消息,另一个进程从队列中读取消息。② 支持按优先级排序的消息传递。

在 Linux 中的实现

  • 消息队列的实现依赖于内核,消息被存储在内核空间。
  • 通过 msgget()msgsnd() msgrcv() 等系统调用实现消息队列的管理和操作。
  • 数据结构:
    • 每个消息队列都有一个 消息队列标识符(key_t)
    • 消息队列的元信息(如消息数量、权限等)存储在内核中。

系统调用

  1. msgget():创建或获取一个消息队列。
int msgid = msgget(key, IPC_CREAT | 0666);
  1. msgsnd():向消息队列中发送消息。
msgsnd(msgid, &msg, sizeof(msg), 0);
  1. msgrcv():从消息队列中接收消息。
msgrcv(msgid, &msg, sizeof(msg), msg_type, 0);
  1. msgctl():控制消息队列(如删除队列、获取队列信息)。
msgctl(msgid, IPC_RMID, NULL);

2. 信号量(Semaphores)
功能:① 信号量用于解决多个进程对共享资源的同步问题。② 提供计数型信号量(可以递增和递减)以实现复杂的同步机制。

在 Linux 中的实现

  • 信号量在 Linux 中是通过内核实现的。
  • System V 信号量支持一个信号量集(semaphore set),每个集可以包含多个信号量。
  • 数据结构:
    • 信号量集通过 key_t 标识。
    • 信号量的当前值存储在内核中。

系统调用

  1. semget():创建或获取一个信号量集。
int semid = semget(key, nsems, IPC_CREAT | 0666);
  1. semop():对信号量执行操作(如 P 操作和 V 操作)。
struct sembuf sb = {0, -1, 0};  // P操作
semop(semid, &sb, 1);
  1. semctl():控制信号量(如设置初值、删除信号量)。
semctl(semid, 0, SETVAL, value);

P 和 V 操作

  • P 操作(semop() 减 1):检查信号量是否为正数,若是则减 1;否则阻塞等待。
  • V 操作(semop() 加 1):将信号量加 1,唤醒等待的进程。

3. 共享内存(Shared Memory)
功能:① 共享内存是 System V IPC 中效率最高的通信方式,允许多个进程直接访问同一块内存区域。② 进程可以通过映射同一段内存来共享数据。

在 Linux 中的实现

  • 共享内存由内核分配,进程通过共享内存标识符访问该内存。
  • 数据结构:
    • 共享内存段通过 key_t 标识。
    • 内核中维护共享内存的元信息(如大小、权限等)。

系统调用

  1. shmget():创建或获取一个共享内存段。
int shmid = shmget(key, size, IPC_CREAT | 0666);
  1. shmat():将共享内存段映射到进程的地址空间。
void *shmptr = shmat(shmid, NULL, 0);
  1. shmdt():将共享内存段从进程的地址空间中分离。
shmdt(shmptr);
  1. shmctl():控制共享内存段(如删除段、获取段信息)。
shmctl(shmid, IPC_RMID, NULL);

System V IPC 的现代扩展与限制

扩展

  • POSIX IPC
    • 除了 System V IPC,Linux 还支持 POSIX IPC(如基于 mmap 的共享内存、POSIX 消息队列和信号量)。
    • POSIX IPC 通常比 System V 更简单易用。
  • Linux 专用机制
    • Linux 还实现了其他高效的进程间通信机制,如:
      • 管道(Pipe)命名管道(FIFO)
      • 套接字(Socket),包括本地套接字和网络套接字。

限制
System V IPC 机制存在一些缺点:

  1. 管理复杂:System V IPC 的资源(如消息队列、信号量、共享内存段)需要手动清理,否则可能残留在系统中。
  2. 不够灵活:与 POSIX IPC 或 Linux 专用的 IPC 机制相比,System V IPC 的接口较繁琐。
  3. 标识符冲突:System V 使用 key_t 作为资源标识符,不同进程间可能发生冲突。
System V IPC 与现代 Linux 的结合

尽管 System V IPC 是传统的 UNIX 机制,但现代 Linux 系统仍然广泛支持并使用它:

  1. 兼容性:System V IPC 是 Linux 的核心功能,与传统 UNIX 保持高度兼容。
  2. 性能优化:Linux 对 System V IPC 的实现进行了优化,尤其是共享内存的高速访问能力。
  3. 实际应用:System V IPC 在许多传统企业软件和开源项目(如数据库、分布式系统)中仍有重要应用。
案例:综合使用 System V IPC

我在这里写了一个实际的小案例,展示如何结合 System V 消息队列、信号量和共享内存实现进程间通信:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/sem.h>
#include <sys/shm.h>// 消息队列结构
struct message {long msg_type;char msg_text[100];
};int main() {key_t key = ftok("progfile", 65);// 创建消息队列int msgid = msgget(key, 0666 | IPC_CREAT);struct message msg;msg.msg_type = 1;strcpy(msg.msg_text, "Hello, System V IPC!");// 发送消息msgsnd(msgid, &msg, sizeof(msg), 0);printf("Message sent: %s\n", msg.msg_text);// 创建共享内存int shmid = shmget(key, 1024, 0666 | IPC_CREAT);char *shm_ptr = (char *)shmat(shmid, NULL, 0);strcpy(shm_ptr, "Shared memory example");printf("Shared memory written: %s\n", shm_ptr);// 创建信号量int semid = semget(key, 1, 0666 | IPC_CREAT);semctl(semid, 0, SETVAL, 1);// P 操作struct sembuf sb = {0, -1, 0};semop(semid, &sb, 1);printf("Semaphore locked\n");// V 操作sb.sem_op = 1;semop(semid, &sb, 1);printf("Semaphore unlocked\n");// 清理资源msgctl(msgid, IPC_RMID, NULL);shmctl(shmid, IPC_RMID, NULL);semctl(semid, 0, IPC_RMID);return 0;
}

解释此处 ftok 函数 的作用:在 UNIX 和 Linux 系统中,ftok 是一个用于生成 System V IPC 键值 的函数,全称是 File to Key 意思是“从文件生成键值”。它的主要作用是为消息队列、信号量和共享内存等 System V IPC 对象生成一个唯一的 键值(key_t 类型),以便多个进程可以通过这个键值访问同一 IPC 对象。

ftok 函数的原型

#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);

参数说明

  1. pathname
    • 一个文件路径,必须是一个已存在的文件。
    • ftok 会根据文件的 i-node 编号 和设备号生成键值,因此文件路径必须指向一个实际存在的文件。
  2. proj_id
    • 一个项目标识符,是一个整数(int 类型),通常是 1 个字符(低 8 位有效)。
    • 它的作用是为键值增加一定的变异性,方便区分不同的 IPC 对象。

返回值:

  • 成功时返回一个 key_t 类型的键值,这是一个整数,供 IPC 对象使用。
  • 如果失败,返回 (key_t)-1,并设置 errno 表示错误原因。

为什么需要 ftok 函数?
System V IPC 键值的作用:① System V IPC(消息队列、信号量、共享内存)需要一个唯一的 键值(key_t),以标识系统中的 IPC 对象。② 多个进程通过相同的 键值 来访问相同的 IPC 对象。③ 键值是用户指定的,保证唯一性是用户的责任。

使用 ftok 的优点

  • ftok 简化了键值的生成:
    • 它利用文件路径的 i-node 编号 和设备号生成键值,这些属性在文件系统中是唯一的。
    • 用户可以通过提供不同的 proj_id 来生成不同的键值,即使文件路径相同也可以生成不同的 IPC 键值。
  • 避免键值冲突:
    • 如果多个程序使用相同的文件路径和不同的 proj_id,可以保证生成的键值彼此不同,避免 IPC 对象的冲突。

需要注意的点:(手动生成键值的局限)

  1. 如果不使用 ftok,用户需要自己生成键值,并确保它在系统中是唯一的。
  2. 手动生成键值容易发生冲突,尤其是当多个程序在同一系统中运行时。

ftok 的工作原理
ftok 的实现依赖于文件的元信息。它生成键值的方式通常如下:

  1. 获取文件的 i-node 编号设备号
  2. 使用文件路径 pathname 所指示文件的 设备号和 i-node 编号 生成一个唯一的值。
  3. 将项目标识符 proj_id(低 8 位)与生成的值结合,最终生成键值。

具体步骤可能类似于:

key_t ftok(const char *pathname, int proj_id) {struct stat statbuf;if (stat(pathname, &statbuf) < 0) {return (key_t)-1;}return ((key_t)(statbuf.st_ino & 0xFFFF) | ((key_t)(statbuf.st_dev & 0xFF) << 16) | ((key_t)(proj_id & 0xFF) << 24));
}

解释:

  • statbuf.st_ino:文件的 i-node 编号,文件系统中唯一标识文件的编号。
  • statbuf.st_dev:文件所在设备的设备号。
  • proj_id:项目标识符,用于区分不同的 IPC 对象。

通过这种方式,生成的键值既与文件路径相关,又与 proj_id 相关,确保了键值的唯一性。

上述案例代码中 ftok 的作用

回顾上述案例代码中的 ftok 调用:

key_t key = ftok("progfile", 65);

作用解析:

  1. 参数解析
    • "progfile"
      • 一个文件路径,指向当前目录下的文件 progfile
      • ftok 会根据该文件的 i-node 编号设备号 生成键值。文件必须存在,否则会导致 ftok 失败。
    • 65
      • 项目标识符,用户定义的整数。这是一个辅助值,用于生成不同的键值。
  2. 生成的键值
    • 如果 "progfile" 存在,且 65 作为项目标识符,ftok 将返回一个唯一的 key_t 值
    • key_t 值 被用于创建或获取 IPC 对象(如消息队列、信号量或共享内存)。
  3. 多进程共享的作用
    • 假设两个进程使用相同的 "progfile" 路径和 65 项目标识符调用 ftok,它们会生成相同的键值,从而访问相同的 IPC 对象。
    • 如果使用不同的项目标识符(如 6566),则会生成不同的键值,访问不同的 IPC 对象。

知识延伸:(ftok 的常见用法与注意事项)

常见用法

  1. 为多个进程生成一致的键值:ftok 的设计目标是生成在不同进程中一致的键值,方便进程共享 IPC 对象。
key_t key = ftok("/tmp/ipcfile", 1);
int msgid = msgget(key, IPC_CREAT | 0666);
  1. 项目标识符的使用:通过改变 proj_id,可以基于同一个文件生成多个不同的键值。
key_t key1 = ftok("/tmp/ipcfile", 1);
key_t key2 = ftok("/tmp/ipcfile", 2);

注意事项

  1. 文件路径必须存在ftok 要求 pathname 指向一个实际存在的文件,否则会返回 -1 并设置 errno
  2. 文件的元信息影响键值:如果文件的 i-node 编号设备号 发生变化(如删除并重新创建文件,或文件被移动到另一个设备),生成的键值也会发生变化。
  3. 键值并不完全唯一ftok 的返回值依赖文件的 设备号i-node 编号项目标识符,因此在极端情况下可能会发生键值冲突(如不同的文件具有相同的 设备号i-node 编号)。
案例中进一步的代码增强:检查 ftok 是否成功

在代码中加入错误检查(也可以更清晰地展示 ftok 的作用):

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>int main() {// 生成 IPC 键值key_t key = ftok("progfile", 65);if (key == -1) {perror("ftok failed");return 1;}// 创建消息队列int msgid = msgget(key, 0666 | IPC_CREAT);if (msgid == -1) {perror("msgget failed");return 1;}printf("Message queue created with key: %d\n", key);return 0;
}

ftok 是一个实用的函数,用于为 System V IPC 对象生成唯一键值。 它通过文件的 i-node 编号设备号 结合用户定义的 proj_id,确保键值尽可能唯一且跨进程一致。其主要作用是简化多个进程对同一 IPC 对象的访问,同时减少键值冲突的可能性。在实际使用中,需要确保文件路径存在并保持一致,同时合理设置项目标识符以避免冲突。

综上。System V IPC 是 UNIX 系统中强大的 进程间通信机制,Linux 完整实现了这些功能,并在性能和兼容性上进行了优化。尽管现代操作系统引入了更多新的 IPC 方法(如 POSIX IPC 和套接字),System V IPC 仍然在许多传统应用场景中广泛使用,尤其是在需要高效共享资源或同步操作的场景中。

以上。仅供学习与分享交流,请勿用于商业用途!转载需提前说明。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

相关文章:

【Linux系统】System V 的 IPC 机制在 Linux 系统中的实现

System V 的 IPC&#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09; 机制是 UNIX 系统中的一大特色&#xff0c;用于在不同进程之间共享数据或同步操作。Linux 系统完整实现了 System V 的 IPC 机制&#xff0c;并在其基础上进行了优化和扩展。这些机…...

计算机网络安全

从广义来说&#xff0c;凡是涉及到网络上信息的机密性、报文完整性、端点鉴别等技术和理论都是网络安全的研究领域。 机密性指仅有发送方和接收方能理解传输报文的内容&#xff0c;而其他未授权用户不能解密&#xff08;理解&#xff09;该报文报文完整性指报文在传输过程中不…...

30.100ASK_T113-PRO 用QT编写视频播放器(一)

1.再buildroot中添加视频解码库 X264, 执行 make menuconfig Target packages -->Libraries --> Multimedia --> X264 CLI 还需要添加 FFmpeg 2. 保存,重新编译 make all 3.将镜像下载开发板...

攻防世界 ctf刷题 新手区1-10

unserialize3 因为我上个笔记写了 php返序列化 所以先趁热打铁 看这个题目名字 我们就知道是 反序列化呀 因为flag有值所以 我们先输个 111 看看有没有线索 没线索但是这边 有个发现就是他是使用get方式传参的 可能他会把我们的输入 进行传入后台有可能进行反…...

DAY35|动态规划Part03|LeetCode:01背包问题 二维、01背包问题 一维、416. 分割等和子集

目录 01背包理论基础&#xff08;一&#xff09; 基本思路 C代码 01背包理论基础&#xff08;二&#xff09; 基本思路 C代码 LeetCode:416. 分割等和子集 基本思路 C代码 01背包理论基础&#xff08;一&#xff09; 题目链接&#xff1a;卡码网46. 携带研究材料 文字…...

三款电容麦的对比

纸面参数 第一款麦克风 灵敏度: -36 dB 2 dB&#xff08;0 dB1V/Pa at 1 kHz&#xff09; 灵敏度较低&#xff0c;需要更高的增益来拾取同样的音量。频率响应: 40 Hz - 18 kHz 响应范围较窄&#xff0c;尤其在高频区域。等效噪音级: ≤18 dB&#xff08;A计权&#xff09; 噪…...

【实战攻略】如何从零开始快速实现深度学习新想法?——四步走战略

标题 【实战攻略】如何从零开始快速实现深度学习新想法&#xff1f;——四步走战略 【核心结论】 通过四步走战略&#xff0c;即找到baseline论文、深入baseline代码、搭建自己的pipeline、融入核心算法&#xff0c;新手也能快速实现深度学习新想法。 【通俗解释&#xff0…...

Python+OpenCV系列:入门环境搭建、图像读写、像素操作、色彩空间和通道、

入门环境搭建、图像读写、像素操作、色彩空间和通道 **Python与OpenCV环境搭建、图像处理与色彩空间介绍****引言****1. Python和OpenCV的环境搭建****1.1 安装Python和OpenCV****1.2 配置开发环境** **2. 图像的读取、显示与保存****2.1 图像的读取****2.2 图像的显示****2.3 …...

如何在鸿蒙API9和x86模拟器中使用MQTT

目录 引言 安装MQTT软件包 避免MQTT软件包自动升级 程序的编写 运行测试 结语 引言 虽然我的课主要是OpenHarmony南向开发的&#xff0c;但是结课时有个同学说他在写鸿蒙APP时无法将MQTT库加入到设备中&#xff0c;希望我帮忙看看。由于他没有鸿蒙的真机&#xff0c;只能…...

http multipart/form-data 数据如何分块传输是一次传输还是多次

multipart/form-data 是一种用于 HTTP 协议中传输数据的格式&#xff0c;它用于传输数据量较大的数据&#xff0c;如文件等。在 multipart/form-data 中&#xff0c;数据可以被分成多个部分&#xff08;chunk&#xff09;&#xff0c;这些部分之间通过特定的分隔符进行分隔。 …...

️️耗时一周,肝了一个超丝滑的卡盒小程序

前言 先看看成品效果&#xff1a; 在上个月&#xff0c;我出于提升自己的英语造句能力的目的&#xff0c;想要找一个阅读或者练习造句类的英语学习 APP&#xff0c;但是最终找了几个 APP 不是不太好用就是要付费。于是我转换思路&#xff0c;找到了一本书&#xff0c;叫《36…...

ubuntu的matlab使用心得

1.读取视频 v VideoReader(2222.mp4);出问题&#xff0c;报错&#xff1a; matlab 错误使用 VideoReader/initReader (第 734 行) 由于出现意外错误而无法读取文件。原因: Unable to initialize the video properties 出错 audiovideo.internal.IVideoReader (第 136 行) init…...

vscode插件 live-server配置https

背景&#xff1a;前端有时候需要在本地搭建https环境测试某些内容&#xff08;如https下访问http资源&#xff0c;下载&#xff09; 步骤&#xff1a; 1.vscode集成开发软件(应该所有前端开发同学都安装了&#xff0c;我用webstorm&#xff0c;vscode备用) 2.vscode安装live…...

腾讯最新图标点选验证码

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/iconclick/9 注意:后续点选验证码内容我不会再讲那么详细,毕竟点选验证训练很多读者都会,而…...

安防视频监控平台Liveweb视频汇聚管理系统管理方案

智慧安防监控Liveweb视频管理平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚Liveweb平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…...

VBA信息获取与处理第四个专题第二节:将工作表数据写入VBA数组

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…...

神经网络入门实战:(六)PyTorch 中的实用工具 SummaryWriter 和 TensorBoard 的说明

(一) SummaryWriter 这里先讲解 SummaryWriter &#xff0c;TensorBoard 会在第二大点进行说明。 SummaryWriter 是 PyTorch 中的一个非常实用的工具&#xff0c;它主要用于将深度学习模型训练过程中的各种日志和统计数据记录下来&#xff0c;并可以与 TensorBoard 配合使用&am…...

SpringBoot的validation参数校验

文章目录 前言一、引入validation 依赖二、validation中的注解说明 &#xff08;1&#xff09;Validated&#xff08;2&#xff09;Valid&#xff08;3&#xff09;NotNull&#xff08;4&#xff09;NotBlank&#xff08;5&#xff09;NotEmpty&#xff08;6&#xff09;Patte…...

RPC与HTTP调用模式的架构差异

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;和 HTTP 调用是两种常见的通信模式&#xff0c;它们在架构上有以下一些主要差异&#xff1a; 协议层面 RPC&#xff1a;通常使用自定义的二进制协议&#xff0c;对数据进行高效的序列化和反序列化&am…...

R语言机器学习论文(六):总结

文章目录 介绍参考文献介绍 本文采用R语言对来自进行数据描述、数据预处理、特征筛选和模型构建。 最后我们获得了一个能有效区分乳腺组织的随机森林预测模型,它的性能非常好,这意味着它可能拥有非常好的临床价值。 在本文中,我们利用R语言对来自美国加州大学欧文分校的B…...

工业—使用Flink处理Kafka中的数据_ProduceRecord2

使用 Flink 消费 Kafka 中 ProduceRecord 主题的数据,统计在已经检验的产品中,各设备每 5 分钟 生产产品总数,将结果存入HBase 中的 gyflinkresult:Produce5minAgg 表, rowkey“...

【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

SpringBoot整合JWT

一. JWT简介 1. 什么是JWT&#xff1f; JWT(JSON Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 它将用户信息加密到token里&#xff0c;服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性&#xff0c;只要正确即通过验证&…...

使用docker创建cloudstack虚拟主机

文章目录 概要 环境准备&#xff1a; 1.使用rockyLinux&#xff1a;8镜像 2.配置yum源 3.添加vim cloudstack.repo为以下内容 4.前期我们已经搭好了cloudstack平台&#xff0c;这里需要映射几个目录到容器里面&#xff0c; 5.创建Dockerfile 6.构建镜像 7.使用命令创建…...

mybatis-xml映射文件及mybatis动态sql

规范 XML映射文件的名称与Mapper接口名称一致&#xff0c;并且将XML映射文件和Mapper接口放置在相同包下(同包同名&#xff09;。 XML映射文件的namespace属性为Mapper接口全限定名一致。 XML映射文件中sql语句的id与Mapper接口中的方法名一致&#xff0c;并保持返回类型一致…...

Qt | TCP服务器实现QTcpServer,使用线程管理客户端套接字

点击上方"蓝字"关注我们 01、QTcpServer >>> QTcpServer 是 Qt 网络模块中的一个类,用于实现TCP服务器。它允许创建一个服务器,可以接受来自客户端的连接。QTcpServer 是事件驱动的,这意味着它将通过信号和槽机制处理网络事件。 常用函数 构造函数: QT…...

rustdesk远程桌面使用

文章目录 简介1.客户端rustdesk使用2.基于 S6-overlay 的镜像 服务端部署3.声明 简介 为什么使用rustdesk&#xff0c;因为向日葵&#xff0c;todesk&#xff0c;免费版本的有各种各样的坑&#xff0c;比如限制你的登录&#xff0c;需要你重新登录使用&#xff0c;画面模糊&am…...

C#中图片的Base64编码与解码转换详解

在C#中&#xff0c;我们可以使用Base64编码将图片转换为字符串&#xff0c;也可以将Base64编码的字符串转换回图片。这通常用于在需要文本表示图像数据的场合&#xff08;例如在Web开发中传输图像数据&#xff09;。 将图片转换为Base64字符串 要将图片文件转换为Base64字符串…...

瑞芯微方案主板Linux修改系统串口波特率教程,触觉智能RK3562开发板演示

遇到部分串口工具不支持1500000波特率&#xff0c;这时候就需要进行修改&#xff0c;本文以触觉智能RK3562开发板修改系统波特率为115200为例&#xff0c;介绍瑞芯微方案主板Linux修改系统串口波特率教程。 温馨提示&#xff1a;瑞芯微方案主板/开发板串口波特率只支持115200或…...

阿里云整理(二)

阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程&#xff1a; 用户在浏览器输入域名URL&#xff0c;例如www.baidu.com。 不过&#xff0c;浏览器并不知道为该域名提供服务的服务器具…...

python实现一个简单的不断发送dns查询的功能

the code below: import socket import struct import time import randomdef create_dns_query(domain"example123.com"):# DNS HeaderID random.randint(0, 65535) # 随机查询IDFLAGS 0x0100 # Standard queryQDCOUNT 1 # One questionANCOUNT 0 # …...

鲲鹏麒麟使用Docker部署Redis5

本次部署采用Docker方式进行部署&#xff0c;服务器为鲲鹏服务器&#xff0c;CPU架构为ARM64&#xff0c;操作系统版本信息为 # cat /etc/kylin-release Kylin Linux Advanced Server release V10 (Tercel)镜像 下载镜像鲲鹏麒麟Redis5镜像包 部署 1、上传镜像到服务器 2、…...

MySQL悲观锁和乐观锁

MySQL悲观锁和乐观锁 在数据库中&#xff0c;锁是用来管理并发控制的一种机制&#xff0c;确保数据的一致性和完整性。MySQL中的悲观锁和乐观锁是两种不同的并发控制策略&#xff0c;它们在处理并发事务时采用不同的方法。 悲观锁&#xff08;Pessimistic Locking&#xff09…...

【AI模型对比】Kimi与ChatGPT的差距:真实对比它们在六大题型中的全面表现!

文章目录 Moss前沿AI语义理解文学知识数学计算天文学知识物理学知识英语阅读理解详细对比列表总结与建议 Moss前沿AI 【OpenAI】获取OpenAI API Key的多种方式全攻略&#xff1a;从入门到精通&#xff0c;再到详解教程&#xff01;&#xff01; 【VScode】VSCode中的智能AI-G…...

一根网线如何用软路由给手机、电脑分配设置不同IP

众所周知&#xff0c;在同一个网络下&#xff0c;我们的互联网IP是一样的&#xff0c;即外网只有一个IP。很多互联网公司、游戏工作室、营利工作室都需要利用它们来实现同一网络下多台设备IP地址不同的效果。对此我们该怎么办&#xff1f;下面给大家简单分享一下&#xff01; 在…...

面经自测——自我介绍

前言 这是作者新开的坑&#xff0c;一切题目都是从网上找的原题&#xff0c;为了总结网上有关的面经&#xff0c;以便在真实面试中较为流利的回答面试官的问题 面试之——自我介绍 自我介绍是面试中最常见的问题之一&#xff0c;主要目的是让面试官了解你的背景、技能和职业…...

uniapp 小程序 监听全局路由跳转 获取路由参数

uniapp 小程序 监听全局路由跳转 获取路由参数 app.vue中 api文档 onLaunch: function(options) {let that this;let event [navigateTo, redirectTo, switchTab, navigateBack];event.forEach(item > {uni.addInterceptor(item, { //监听跳转//监听跳转success(e) {tha…...

【LeetCode每日一题】——204.计数质数

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 204.计数质数 四【题目描述】 给定整数 n &…...

TCP的“可靠性”(下)——三次握手四次挥手

目录 建立连接&#xff08;三次握手&#xff09;为啥要进行握手&#xff1f;&#xff1f;意义何在&#xff1f;&#xff1f;常见面试题&#xff1a;为啥必须是三次握手&#xff1f; 断开连接&#xff08;四次挥手&#xff09;三次握手和四次挥手的相同点和不同点连接过程中涉及…...

【笔记2-5】ESP32:freertos消息队列

主要参考b站宸芯IOT老师的视频&#xff0c;记录自己的笔记&#xff0c;老师讲的主要是linux环境&#xff0c;但配置过程实在太多问题&#xff0c;就直接用windows环境了&#xff0c;老师也有讲一些windows的操作&#xff0c;只要代码会写&#xff0c;操作都还好&#xff0c;开发…...

java操作doc(二)——java利用Aspose.Words动态创建自定义doc文档

有关java动态操作word文档&#xff0c;上一篇写了如何使用模板动态设置对于内容以及相关单元格的动态合并问题&#xff0c;详细请参看如下文档&#xff1a; java利用Aspose.Words操作Word动态模板文档并动态设置单元格合并 这篇文档说说&#xff0c;如何利用Aspose.Words动态…...

计算机光电成像理论基础

一、透过散射介质成像 1.1 光在散射介质中传输 光子携带物体信息并进行成像的过程是一个涉及光与物质相互作用的物理现象。这个过程可以分为几个步骤来理解&#xff1a; 1. **光的发射或反射**&#xff1a; - 自然界中的物体可以发射光&#xff08;如太阳&#xff09;&am…...

【Qt中实现屏幕录制】

在Qt中实现屏幕录制可以通过使用QScreen和QVideoEncoder类来完成。以下是一个简单的示例代码&#xff0c;演示如何捕获屏幕并将其保存为视频文件。请确保已经安装了Qt Multimedia模块&#xff0c;因为我们将使用其中的类来处理视频编码。 下面是一个基本的实现步骤&#xff1a…...

repo仓库转移到自己本地的git服务器

前提条件&#xff1a;搭建好gitolite 以转移正点原子rk3568_linux工程为例子&#xff0c;将其转移到自己的git服务器。 获取完整repo仓库 将正点原子epo仓库sync出来 evanevan-X99:~/SRC/atk$ .repo/repo/repo sync -l -j10 evanevan-X99:~/SRC/atk$ .repo/repo/repo list -n…...

java操作文件(一)——java如何实现多文件打包压缩并下载

在实际开发项目过程中&#xff0c;文件下载是异常频繁的操作&#xff0c;但是多文件zip打包下载并非常见使用场景&#xff0c;本文介绍如何使用io流操作多文件实现压缩并下载。 特别说明&#xff1a; 无需依赖任何第三方包或者拆件 一、效果展示&#xff1a; 1.打包前文件列…...

Git仓库移除文件的暂存和修改

在使用Git进行版本控制时&#xff0c;有时需要移除文件的暂存状态或者撤销对文件的修改。根据不同的需求和场景&#xff0c;可以采取不同的命令来完成这些操作。下面将详细介绍如何在Git中移除文件的暂存以及撤销文件的修改。 请注意&#xff0c;在执行这些命令之前&#xff0…...

Kube-Prometheus-Stack安装时初始化导入自定义Grafana dashboards

获取Grafana dashboards的JSON文件 这里是获取已经编辑好的Grafana dashboards的JSON文件&#xff1b;以便内置到Kube-Prometheus-Stack的helm charts的安装zip文件中。 编辑自定义dashboards JSON文件 获取dashboards JSON文件模板 其实Kube-Prometheus-Stack内部本身已经内…...

2024-12-05OpenCV高级-滤波与增强

OpenCV高级-滤波与增强 文章目录 OpenCV高级-滤波与增强1-OpenCV平滑滤波1. 均值滤波 (cv2.blur())2. 高斯滤波 (cv2.GaussianBlur())3. 中值滤波 (cv2.medianBlur())4. 双边滤波 (cv2.bilateralFilter())总结 2-OpenCV边缘检测1. Sobel算子 (cv2.Sobel())2. Canny边缘检测 (cv…...

taro小程序进入腾讯验证码

接入原因 昨天突然晚上有人刷我们公司的登录发送短信接口&#xff0c;紧急将小程序的验证码校验更新上去了 接下来就是我们的接入方法&#xff0c;其实很简单&#xff0c;不过有时候可能大家着急就没有仔细看文档&#xff0c;腾讯验证码文档微信小程序地址&#xff0c;注意这里…...

微信小程序怎么实现非tabbar页面显示tabbar,自定义组件实现

微信小程序没有发现可以实现非tabbar页面显示tabbar的方法&#xff0c;但是可以在tabbar页面当中隐藏tabbar&#xff0c;使用wx.hideTabBar()方法就可以实现&#xff0c;在非tabbar页面调用wx.showTabBar()方法却会显示失败&#xff0c;不能显示tabbar onLoad() {wx.showTabBar…...