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

Linux System V - 消息队列与责任链模式

概念

消息队列是一种以消息为单位的进程间通信机制,允许一个或多个进程向队列中发送消息,同时允许一个或多个进程从队列中接收消息。消息队列由内核维护,具有以下特点:

  • 异步通信:发送方和接收方不需要同时运行,消息会存储在队列中。

  • 消息优先级:支持消息的优先级排序。

  • 消息分类:每条消息都有一个类型,可以根据类型选择性地接收。

  • 持久性:即使发送方或接收方意外退出,消息仍然保留在队列中。

内核结构

在 /usr/include/linux/msg.h 中,可以查看到消息队列的结构如下:

struct msqid_ds {
struct ipc_perm msg_perm;
struct msg msg_first; / first message on queue,unused */
struct msg msg_last; / last message in queue,unused */
__kernel_time_t msg_stime; /* last msgsnd time */
__kernel_time_t msg_rtime; /* last msgrcv time */
__kernel_time_t msg_ctime; /* last change time */
unsigned long msg_lcbytes; /* Reuse junk fields for 32 bit */
unsigned long msg_lqbytes; /* ditto */
unsigned short msg_cbytes; /* current number of bytes on queue */
unsigned short msg_qnum; /* number of messages in queue */
unsigned short msg_qbytes; /* max number of bytes on queue */
__kernel_ipc_pid_t msg_lspid; /* pid of last msgsnd */
__kernel_ipc_pid_t msg_lrpid; /* last receive pid */
};

其中 struct ipc_perm 是 System V IPC(进程间通信)机制中用于描述 IPC 对象(如消息队列、信号量集或共享内存段)权限和所有者信息的数据结构。它定义了谁可以访问和操作这些 IPC 资源,以及它们的访问权限,其中该结构体位于 /usr/include/linux/ipc.h 内,定义如下:

struct ipc_perm {
key_t __key; /* Key supplied to xxxget(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 */
unsigned short __seq; /* Sequence number */
};

接口说明

以下函数均包含在头文件 <sys/ipc.h> 和 <sys/msg.h> 中

msgget

功能:调用创建或获取一个消息队列

int msgget(key_t key, int msgflg);
  • key:唯一标识消息队列的键值,通常通过 ftok 函数生成。

我们可以看到 key 的类型为 key_t,实际上也是一个整数,不过要保证其数值的唯一性,要获取该参数 key 我们需要使用 ftok 函数,它会根据一个文件路径和一个项目标识符(proj_id)通过一系列算法生成一个几乎唯一的键值。

  • pathname 是一个指向存在的文件路径的指针,实际上可以随便写。
  • proj_id 是一个整数,通常是一个字符常量,其低8位被用于生成键值,实际上可以随便写。

  • msgflg:指定消息队列的权限和行为,由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的。

其中最为常用的shmflg如下:

  • IPC_CREAT:如果共享内存段不存在,则创建一个新的共享内存段,存在则返回 shmid。
  • IPC_EXCL:与IPC_CREAT一起使用时,确保创建新的共享内存段,如果共享内存段已存在则失败。
  • 权限位:shmflg的低9位用于设置共享内存段的权限,与文件系统的权限位相同。
#include <sys/ipc.h>
#include <sys/msg.h>
#include <iostream>
using namespace std;
int main()
{key_t key = ftok("/home/lbk/lesson27/test.cc", 8888);int msgid = msgget(key, IPC_CREAT);return 0;
}

msgsnd

功能:用于向消息队列中发送消息。

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
参数
  • msgid:消息队列的 ID(由 msgget() 返回)。

  • msgp:指向消息结构的指针。消息结构的第一个字段必须是 long 类型,表示消息类型,如下。

struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[1]; /* message data */
};
// 以⼀个long int⻓整数开始,接收者函数将利⽤⽤这个⻓整数确定消息的类型
  • msgsz:消息的大小(不包括消息类型字段)。

  • msgflg:标志位,常用值:

    • 0:阻塞模式,直到消息被发送。

    • IPC_NOWAIT:非阻塞模式,如果队列已满,立即返回。

返回值
  • 成功时返回 0

  • 失败时返回 -1 并设置 errno

#include <sys/ipc.h>
#include <sys/msg.h>
#include <iostream>
using namespace std;
struct msg_buffer
{long msg_type;char *msg_text;
};
int main()
{key_t key = ftok("/home/lbk/lesson27/test.cc", 8888);int msgid = msgget(key, IPC_CREAT);msg_buffer sendbuf = {1, "hello world!"};msgsnd(msgid, &sendbuf, sizeof(sendbuf.msg_text), 0);return 0;
}

msgrcv

功能:用于从消息队列中接收消息。

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
参数
  • msgid:消息队列的 ID。

  • msgp:指向消息结构的指针。

  • msgsz:消息的最大接收大小(不包括消息类型字段)。

  • msgtyp:指定接收的消息类型:

    • 0:接收队列中第一个消息。

    • >0:接收指定类型的消息。

    • <0:接收类型小于等于该值的最小类型消息。

  • msgflg:标志位:

    • 0:阻塞模式,直到消息可用。

    • IPC_NOWAIT:非阻塞模式,如果队列为空,立即返回。

返回值
  • 成功时返回实际接收的消息大小。

  • 失败时返回 -1 并设置 errno

#include <sys/ipc.h>
#include <sys/msg.h>
#include <iostream>
using namespace std;
struct msg_buffer
{long msg_type;char *msg_text;
};
int main()
{key_t key = ftok("/home/lbk/lesson27/test.cc", 8888);int msgid = msgget(key, IPC_CREAT);msg_buffer sendbuf = {1, "hello world!"};msgsnd(msgid, &sendbuf, sizeof(sendbuf.msg_text), 0);msg_buffer receivebuf;msgrcv(msgid, receivebuf.msg_text, 1024, 2, 0);cout << receivebuf.msg_text << endl;return 0;
}

msgctl

功能:用于对消息队列进行控制操作,如获取状态、设置属性或删除队列。

int msgctl(int msqid, int cmd, struct msqid_ds *buf);
参数
  • msgid:消息队列的 ID。

  • cmd:指定操作命令:

    • IPC_STAT:获取消息队列的状态信息,存储到 buf 中。

    • IPC_SET:设置消息队列的权限和属性。

    • IPC_RMID:删除消息队列。

  • buf:用于存储或修改消息队列的状态信息。

返回值
  • 成功时返回 0

  • 失败时返回 -1 并设置 errno

#include <sys/ipc.h>
#include <sys/msg.h>
#include <iostream>
using namespace std;
struct msg_buffer
{long msg_type;char *msg_text;
};
int main()
{key_t key = ftok("/home/lbk/lesson27/test.cc", 8888);int msgid = msgget(key, IPC_CREAT);msg_buffer sendbuf = {1, "hello world!"};msgsnd(msgid, &sendbuf, sizeof(sendbuf.msg_text), 0);msg_buffer receivebuf;msgrcv(msgid, receivebuf.msg_text, 1024, 2, 0);cout << receivebuf.msg_text << endl;// 删除消息队列if (receivebuf.msg_text == "quit"){msgctl(msgid, IPC_RMID, nullptr) == -1;}return 0;
}

基本通信示例

MessageQueue.hpp

#include <sys/ipc.h>
#include <sys/msg.h>
#include <iostream>
#include <string>
#include <cstring>
#include <unistd.h>
using namespace std;#define SIZE 1024
#define PATH "/home/lbk/lesson27/MessageQueue.hpp"
#define PROJETID 6666
#define CREATE_MESSAGEQUEUE (IPC_CREAT | IPC_EXCL | 0666)
#define GET_MESSAGEQUEUE (IPC_CREAT)
#define SERVERTYPE 1
#define CLIENTTYPE 2
enum
{KEY_ERROR = 1,MSGGET_ERRO,
};
struct msg_buffer
{long msg_type;char msg_text[SIZE];
};
class MessageQueue
{
public:void Create(int flag){key_t key = ftok(PATH, PROJETID);if (key < 0){cerr << "ftok error" << endl;exit(KEY_ERROR);}_msgid = msgget(key, flag);if (_msgid < 0){cerr << "msgget error" << endl;exit(MSGGET_ERRO);}}bool SendMessage(const string &in, long type){msg_buffer buf;buf.msg_type = type;strcpy(buf.msg_text, in.c_str());int n = msgsnd(_msgid, &buf, SIZE, 0);if (n < 0){cout << "SendMessage error" << endl;return false;}return true;}bool ReceiveMessage(string *out, long type){msg_buffer buf;int n = msgrcv(_msgid, &buf, SIZE, type, 0);if (n < 0){cout << "ReceiveMessage error" << endl;return false;}buf.msg_text[n] = 0;*out = buf.msg_text;return true;}void Destroy(){msgctl(_msgid, IPC_RMID, nullptr);}private:int _msgid;
};class MessageQueueServer : public MessageQueue
{
public:MessageQueueServer(){Create(CREATE_MESSAGEQUEUE);}~MessageQueueServer(){Destroy();}
};class MessageQueueClient : public MessageQueue
{
public:MessageQueueClient(){Create(GET_MESSAGEQUEUE);}
};

server.cc

#include "MessageQueue.hpp"
int main()
{MessageQueueServer server;string message;while (message != "quit"){server.ReceiveMessage(&message, CLIENTTYPE);cout << "server receive: " << message << endl;}return 0;
}

client.cc

#include "MessageQueue.hpp"
int main()
{MessageQueueClient client;string message;while (message != "quit"){getline(cin, message);client.SendMessage(message, CLIENTTYPE);}return 0;
}

makefil

责任链模式

新需求:
  • client 发送给 server 的输⼊内容,拼接上时间,进程pid信息
  • server 收到的内容持久化保存到⽂件中
  • ⽂件的内容如果过⼤,要进⾏切⽚保存并在指定的⽬录下打包保存,命令⾃定义
解决⽅案:责任链模式
⼀种⾏为设计模式,它允许你将请求沿着处理者链进⾏传递。每个处理者都对请求进⾏检查,以决定是否处理它。如果处理者能够处理该请求,它就处理它;否则,它将请求传递给链中的下⼀个处理者。这个模式使得多个对象都有机会处理请求,从⽽避免了请求的发送者和接收者之间的紧耦合。

主要特点

  • 解耦请求和处理:请求的发送者不需要知道具体的处理者是谁,只需要将请求发送到链上即可。

  • 动态组合处理逻辑:可以在运行时动态地添加或修改处理者,灵活地调整处理逻辑。

  • 职责分离:每个处理者只负责处理自己能够处理的请求,无法处理的请求则传递给下一个处理者。

代码示例

HandleText.hpp

#pragma once
#include <iostream>
#include <string>
#include <memory>
#include <ctime>
#include <sstream>
#include <fstream>
#include <unistd.h>
#include <filesystem>
#include <sys/wait.h>
using namespace std;
class HandleText
{
public:HandleText(): _enable(true){}void Enable(){_enable = true;}void Disenable(){_enable = false;}void SetNextHandler(shared_ptr<HandleText> &handler){_next_handler = handler;}virtual void Excute(string &info) = 0;protected:bool _enable;shared_ptr<HandleText> _next_handler;
};class HandleTextFormat : public HandleText
{
public:void Excute(string &info) override{if (_enable){cout << "Format ..." << endl;stringstream ss;time_t now = time(nullptr);char buffer[80];strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", localtime(&now));ss << buffer << "-" << getpid() << ":" << info << "\n";info = ss.str();}if (_next_handler){_next_handler->Excute(info);}}
};#define DefaultFilePath "./tmp/"
#define DefaultFileName "test.log"
class HandleTextSaveFile : public HandleText
{
public:HandleTextSaveFile(){_path = DefaultFilePath;_name = DefaultFileName;if (!filesystem::exists(_path)){filesystem::create_directories(_path);}}void Excute(string &info) override{if (_enable){cout << "Save ..." << endl;string file = _path + _name;ofstream out(file, ios::app);if (!out.is_open())return;out << info;out.close();}if (_next_handler){_next_handler->Excute(info);}}private:string _path;string _name;
};const int maxline = 5;
class HandleTextBackup : public HandleText
{
public:HandleTextBackup(){_path = DefaultFilePath;_name = DefaultFileName;}void Excute(string &info) override{if (_enable){cout << "Backup ..." << endl;string file = _path + _name;ifstream in(file);if (!in.is_open())return;string line;int linecount = 0;while (getline(in, line)){linecount++;}if (linecount > maxline){cout << "消息⾏数超过" << maxline << ", 触发⽇志备份 " << endl;Backup();}}if (_next_handler){_next_handler->Excute(info);}}void Backup(){int pid = fork();string newfile = _name + "." + to_string(time(nullptr));if (pid == 0){chdir(_path.c_str());filesystem::rename(_name, newfile); // 重命名文件// 打包文件string tarfile = newfile + ".tar";execlp("tar", "tar", "-czf", tarfile.c_str(), newfile.c_str(), nullptr);exit(0);}waitpid(pid, nullptr, 0);string tmpfile = _path + newfile;filesystem::remove(tmpfile);}private:string _path;string _name;
};class HandlerEntry
{
public:HandlerEntry(){_format = make_shared<HandleTextFormat>();_save = make_shared<HandleTextSaveFile>();_backup = make_shared<HandleTextBackup>();_format->SetNextHandler(_save);_save->SetNextHandler(_backup);}void EnableHandler(bool isformat, bool issave, bool isbackup){isformat ? _format->Enable() : _format->Disenable();issave ? _save->Enable() : _save->Disenable();isbackup ? _backup->Enable() : _backup->Disenable();}void Run(string &info){_format->Excute(info);}private:shared_ptr<HandleText> _format;shared_ptr<HandleText> _save;shared_ptr<HandleText> _backup;
};

相关文章:

Linux System V - 消息队列与责任链模式

概念 消息队列是一种以消息为单位的进程间通信机制&#xff0c;允许一个或多个进程向队列中发送消息&#xff0c;同时允许一个或多个进程从队列中接收消息。消息队列由内核维护&#xff0c;具有以下特点&#xff1a; 异步通信&#xff1a;发送方和接收方不需要同时运行&#x…...

k2路由器登录校园网

教程1刷入Breed&#xff0c;并手动刷入Padavan固件&#xff1a;斐讯K1、K2、K2P 刷机、刷入Breed 辅助工具 | tb (tbvv.net) Padavan下载网址&#xff1a; 我用的是&#xff1a; Padavan 登录的网址是 192.168.123.1 Padavan配置教程&#xff1a; 先用网线连上校园网&#…...

Docker基础实践与应用举例

Docker 是一个轻量级容器化平台&#xff0c;通过将应用及其依赖打包到容器中&#xff0c;实现快速部署和环境一致性。以下是 Docker 的实践与应用场景举例&#xff0c;结合具体操作步骤&#xff1a; 一、基础实践 1. 快速启动一个容器 # 运行一个Nginx容器&#xff0c;映射宿…...

EndNote与Word关联:科研写作的高效助力

在科研领域&#xff0c;文献管理与论文写作是紧密相连的重要环节。EndNote作为一款强大的文献管理工具&#xff0c;与Word实现有效关联后&#xff0c;能极大地提升科研写作效率。本文将详细介绍EndNote与Word关联的方法、关联后的优势、常见问题及解决办法&#xff0c;助力科研…...

用PyTorch从零构建 DeepSeek R1:模型架构和分步训练详解

DeepSeek R1 的完整训练流程核心在于&#xff0c;在其基础模型 DeepSeek V3 之上&#xff0c;运用了多种强化学习策略。 本文将从一个可本地运行的基础模型起步&#xff0c;并参照其技术报告&#xff0c;完全从零开始构建 DeepSeek R1&#xff0c;理论结合实践&#xff0c;逐步…...

SOME/IP-SD -- 协议英文原文讲解2

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.2.2 S…...

Matlab——图像保存导出成好看的.pdf格式文件

点击图像的右上角&#xff0c;点击第一个保存按钮键。...

Mybatis常用动态 SQL 相关标签

1. <if> 用于条件判断&#xff0c;当满足条件时执行对应的 SQL 片段。 示例: <select id"findUser" resultType"User">SELECT * FROM usersWHERE 11<if test"name ! null and name ! ">AND name #{name}</if><if…...

计算机网络与通讯知识总结

计算机网络与通讯知识总结 基础知识总结 1)FTP:文件传输 SSH:远程登录 HTTP:网址访问 2)‌交换机 定义‌:一种基于MAC地址实现局域网(LAN)内数据高速转发的网络设备,可为接入设备提供独享通信通道‌。 -‌ 核心功能‌: 1.数据链路层(OSI第二层)工作,通过MAC地址…...

Redis 通用命令

Redis 通用命令 文章目录 Redis 通用命令 1. 启动redis 1.1 前台启动1.2 后台启动1.3 开机自启 2.Redis命令行客户端3. 常见命令 3.1 help3.2 KEYS3.3 DEL3.4 EXISTS3.5 EXPIRE&TTL 1. 启动redis 1.1 前台启动 在安装好redis后&#xff0c;我们可以在任意目录输入以…...

【idea问题排查技巧】

以下是针对 IDEA 中 日志打标(动态标记) 和 全链路追踪 功能的分步详解,结合具体场景和操作截图说明,帮助快速掌握实战技巧。 一、动态日志打标:不修改代码输出关键信息 1. 断点日志打印(非侵入式打标) 场景:在调试时,需要临时查看某个变量的值,但不想修改代码添加…...

VSCode自定义快捷键和添加自定义快捷键按键到状态栏

VSCode自定义快捷键和添加自定义快捷键按键到状态栏 &#x1f4c4;在VSCode中想实现快捷键方式执行与某些指令操作进行绑定&#xff0c;可以通过配置组合式的键盘按键映射来实现&#xff0c;另外一种方式就是将执行某些特定的指令嵌入在面板菜单上&#xff0c;在想要执行的时候…...

【Redis 原理】通信协议 内存回收

文章目录 通信协议--RESP内存回收内存过期策略惰性删除周期删除 内存淘汰策略 通信协议–RESP Redis是一个CS架构的软件&#xff0c;通信一般分两步&#xff08;不包括pipeline和PubSub&#xff09;&#xff1a; 客户端&#xff08;client&#xff09;向服务端&#xff08;se…...

AWS - Redshift - 外部表读取 Parquet 文件中 timestamp 类型的数据

问题&#xff1a; 通过 Redshift Spectrum 功能可以读取 S3 中的文件&#xff0c;当读取 Parquet 文件时&#xff0c;如果列格式设置为 timestamp&#xff0c; 通过 psql 客户端读取会出现以下错误&#xff1a; testdb# select * from myspectrum_schema_0219.test_ns; ERROR…...

H5--开发适配

在 H5 开发中&#xff0c;适配不同设备和屏幕尺寸至关重要&#xff0c;它能确保页面在各种环境下都有良好的显示效果和用户体验。以下介绍几种常见的 H5 开发适配方案&#xff1a; 视口&#xff08;Viewport&#xff09;设置 视口单位是相对于浏览器视口的尺寸进行度量的单位&…...

llama-factory部署微调方法(wsl-Ubuntu Windows)

llama-factory项目GitHub地址&#xff1a;GitHub - hiyouga/LLaMA-Factory: Unified Efficient Fine-Tuning of 100 LLMs & VLMs (ACL 2024) wsl-Ubuntu&#xff1a; 1.获取项目 git clone https://github.com/hiyouga/LLaMA-Factory.gitcd LLaMA-Factory/ 2.安装环境…...

【Unity】鱼群效果模拟

鱼群效果模拟 文章目录 鱼群效果模拟Boid算法实现方式version1_CPUversion2_GPUversion3_Multilaterationversion4_Bitonic_Sorting &#xff08;GPU友好&#xff09;version5_Skinning &#xff08;TODO&#xff09; 细节项优化项参考链接 Boid算法 Boid算法是一种模拟群体行…...

C++ 编程语言简介

C 是一种通用编程语言&#xff0c;它是作为 C 语言的增强而开发的&#xff0c;以包含面向对象的范例。它是一种命令式和编译语言。 C 是一种高级的通用编程语言&#xff0c;专为系统和应用程序编程而设计。它由贝尔实验室的 Bjarne Stroustrup 于 1983 年开发&#xff0c;作为…...

Day15-后端Web实战-登录认证——会话技术JWT令牌过滤器拦截器

目录 登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1 介绍2.3.2 生成和校…...

迪威模型:引领 3D 模型轻量化技术革新

在数字化时代&#xff0c;3D 模型的应用领域愈发广泛&#xff0c;从影视制作、游戏开发到工业设计、建筑仿真等&#xff0c;都离不开 3D 模型的支持。然而&#xff0c;随着模型复杂度的不断提高&#xff0c;文件体积也日益庞大&#xff0c;这给存储、传输和加载带来了极大的挑战…...

大学本科教务系统设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点

以下是大学本科教务系统的设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点: 大学本科教务系统设计方案 一、需求分析 1. 核心用户角色 角色功能需求学生选课/退课、成绩查询、课表查看、学分统计、考试报名、学业预警教师成绩录入、课程大纲上传、教学进度管理、…...

安装Liunx(CentOS-6-x86_64)系统

一&#xff1a;下载与安装Liunx&#xff08;CentOS-7-x86_64&#xff09; 1.下载&#xff1a; CentOS-6.10-x86_64-bin-DVD1.iso 2.安装&#xff1a; 按照自己的需求来 下载的镜像文件地址 加载完成后设置 查看网络和本地ip 3.配置仓库&#xff08;用于yum下载&#xff0…...

DeepSeek开源周 Day01:从FlashMLA背后原理回顾KV Cache

FlashMLA 今天DeepSeek开源周第一天&#xff0c;开放了FlashMLA仓库&#xff0c;1小时内星标1.6k&#xff01; FlashMLA 是一个高效的 MLA 解码内核&#xff0c;专为 Hopper GPU 优化&#xff0c;适用于可变长度序列。该项目目前发布了 BF16 和具有 64 块大小分页 kvcache 的功…...

java23种设计模式-工厂方法模式

工厂方法模式&#xff08;Factory Method Pattern&#xff09;学习笔记 &#x1f31f; 定义 工厂方法模式属于创建型设计模式&#xff0c;定义一个创建对象的接口&#xff0c;但让子类决定实例化哪一个类。将类的实例化操作延迟到子类&#xff0c;是面向对象设计中"开闭…...

数据驱动未来!天合光能与永洪科技携手开启数字化新篇章

在信息化时代的今天&#xff0c;企业间的竞争早就超越了传统产品与服务的范畴&#xff0c;新的核心竞争力即——数据处理能力和信息技术的应用。作为数据技术领域的领军者&#xff0c;永洪科技凭借其深厚的技术积累和丰富的行业经验&#xff0c;成功助力天合光能实现数字化升级…...

【C++设计模式】工厂方法设计模式:深入解析从基础到进阶

1. 引言 在软件开发的世界里,设计模式如同巧妙的建筑蓝图,为解决常见问题提供了行之有效的方案。工厂方法模式作为一种广受欢迎的创建型设计模式,以其独特的优势在众多项目中得到广泛应用。它不仅能够为对象的创建提供通用且灵活的方式,还能有效隐藏实现细节,提升代码的可…...

Vue 3 + Vite 项目中配置代理解决开发环境中跨域请求问题

在 Vue 3 Vite 项目中&#xff0c;配置代理是解决开发环境中跨域请求问题的常见方法。通过在 Vite 的配置文件中设置代理&#xff0c;可以将前端请求转发到后端服务器&#xff0c;从而避免浏览器的同源策略限制。 1. 创建 Vue 3 Vite 项目 首先&#xff0c;确保你已经安装了…...

2.3 变量

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 变量是用来存放某个值的数据&#xff0c;它可以表示一个数字、一个字符串、一个结构、一个类等。变量包含名称、类型和值。在代码中…...

16、Python面试题解析:python中的浅拷贝和深拷贝

在 Python 中&#xff0c;浅拷贝&#xff08;Shallow Copy&#xff09; 和 深拷贝&#xff08;Deep Copy&#xff09; 是处理对象复制的两种重要机制&#xff0c;它们的区别主要体现在对嵌套对象的处理方式上。以下是详细解析&#xff1a; 1. 浅拷贝&#xff08;Shallow Copy&a…...

BUUCTF-Web方向21-25wp

目录 [HCTF 2018]admin弱口令session伪造 [MRCTF2020]你传你&#x1f40e;呢[护网杯 2018]easy_tornado[ZJCTF 2019]NiZhuanSiWei[MRCTF2020]Ez_bypass第一层第二层 [HCTF 2018]admin 打开环境&#xff0c;有三处提示&#xff0c;一个跳转链接&#xff0c;一个登录注册&#x…...

elementPlus 中表单验证方法(手机号、正整数、邮箱)

1、手机号验证 <el-form ref"formRef" :model"form" :rules"rule" label-width"100px"><el-form-item label"联系电话" prop"mobile"><el-input type"tel" v-model"form.mobile&q…...

阿里云 ACS:高效、弹性、低成本的容器计算解决方案

阿里云的 容器计算服务&#xff08;Alibaba Cloud Container Service, ACS&#xff09; 是一种 Serverless 容器计算 解决方案&#xff0c;提供高度弹性、低成本、易管理的 Kubernetes&#xff08;K8s&#xff09;容器运行环境。用户无需关注底层服务器资源&#xff0c;而是直接…...

启动Redis报错记录

突然启动Redis就报了个错&#xff1a;‘Could not create server TCP listening socket 127.0.0.1:6379: bind: 操作成功完成。‘ 查了下解决方案&#xff0c;应该是6379端口已绑定&#xff0c;服务没有关闭。 需要输入命令redis-cli 再输入shutdown 但又出现了新的问题&…...

springBoot统一响应类型2.0版本

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…...

ubuntu离线安装Ollama并部署Llama3.1 70B INT4

文章目录 1.下载Ollama2. 下载安装Ollama的安装命令文件install.sh3.安装并验证Ollama4.下载所需要的大模型文件4.1 加载.GGUF文件&#xff08;推荐、更容易&#xff09;4.2 加载.Safetensors文件&#xff08;不建议使用&#xff09; 5.配置大模型文件 参考&#xff1a; 1、 如…...

Unity游戏制作中的C#基础(4)数组声明和使用

一、数组的声明 在 C# 中&#xff0c;声明数组有多种方式&#xff0c;每种方式都有其适用的场景&#xff0c;下面为你逐一详细介绍&#xff1a; 1. 直接初始化声明 这种方式直观且便捷&#xff0c;在声明数组的同时就为其赋初值&#xff0c;让数组从诞生之初就拥有了具体的数据…...

自定义SpringBoot Starter

✅自定义SpringBoot Starter SpringBoot 的 starter 可以帮我们简化配置&#xff0c;非常的方便&#xff0c;定义起来其实也不复杂&#xff0c;我的项目中定义了很多 starter&#xff0c;比如business-job就是一个 stater&#xff0c;以他为例&#xff0c;介绍下如何定义 star…...

电脑经常绿屏(蓝屏)怎么办(解决方法)?

一、排查系统与驱动问题 进入安全模式修复系统 强制重启电脑 3 次触发恢复环境&#xff0c;选择 疑难解答 > 高级选项 > 启动设置 > 重启&#xff0c;按 F5 或 5 进入带网络连接的安全模式3。 在安全模式下&#xff0c;尝试卸载最近安装的软件或更新&#xff0c;尤其…...

IO/网络IO基础全览

目录 IO基础CPU与外设1. 程序控制IO&#xff08;轮询&#xff09;2. 中断中断相关知识中断分类中断处理过程中断隐指令 3. DMA&#xff08;Direct Memory Access&#xff09; 缓冲区用户空间和内核空间IO操作的拷贝概念传统IO操作的4次拷贝减少一个CPU拷贝的mmap内存映射文件(m…...

DPVS-5: 后端服务监控原理与测试

后端监控原理 被动监测 DPVS自带了被动监控&#xff0c;通过监控后端服务对外部请求的响应情况&#xff0c;判断服务器是否可用。 DPVS的被动监测&#xff0c;并不能获取后端服务器的详细情况&#xff0c;仅仅通过丢包/拒绝情况来发觉后端服务是否可用。 TCP session state…...

前端基础知识

1. 变量和常量 1.1 变量 // 变量let name Jacklet age 20name lisiage 18 1.2 常量 // 常量const PI 3.14// PI 3.1415926 // error&#xff0c;常量不可重新赋值const articleList []const user {name: vue3,age: 10} 1.3 const 声明的数组和对象 因为数组和对象在…...

从零到一学习c++(基础篇--筑基期十一-类)

从零到一学习C&#xff08;基础篇&#xff09; 作者&#xff1a;羡鱼肘子 温馨提示1&#xff1a;本篇是记录我的学习经历&#xff0c;会有不少片面的认知&#xff0c;万分期待您的指正。 温馨提示2&#xff1a;本篇会尽量用更加通俗的语言介绍c的基础&#xff0c;用通俗的语言去…...

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…...

C#与AI的交互(以DeepSeek为例)

C#与ai的交互 与AI的交互使用的Http请求的方式&#xff0c;通过发送请求&#xff0c;服务器响应ai生成的文本 下面是完整的代码&#xff0c;我这里使用的是Ollama本地部署的deepseek&#xff0c;在联网调用api时&#xff0c;则url会有不同 public class OllamaRequester {[Se…...

Sky Hackathon 清水湾的水 AI美食助手

这里写自定义目录标题 视频 视频 video...

基于SpringBoot的校园消费点评管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

企业财务数据分析-投资回报指标ROA

上一篇文章主要介绍了关于投资回报的核心指标ROE&#xff0c;其实还有一个比较关键的指标资产回报率指标&#xff08;ROA&#xff09;&#xff0c;资产收益率是用来衡量企业盈利能力的重要财务分析指标。资产收益率越高&#xff0c;说明企业资产的利用效率越高&#xff0c;利用…...

PostgreSQL 支持字段类型

PostgreSQL 支持多种字段类型&#xff0c;以下是常见的主要类别和具体类型的简要概述&#xff1a; 数值类型 SMALLINT&#xff1a;2字节整数&#xff0c;范围 -32768 到 32767 INTEGER&#xff1a;4字节整数&#xff0c;范围 -2147483648 到 2147483647 BIGINT&#xff1a;8字节…...

Deepseek引爆AI热潮 防静电地板如何守护数据中心安全

近期&#xff0c;Deepseek的爆火将人工智能推向了新的高度&#xff0c;也引发了人们对AI背后基础设施的关注。作为AI运行的“大脑”&#xff0c;数据中心承载着海量数据的存储、处理和传输&#xff0c;其安全稳定运行至关重要。而在这背后&#xff0c;防静电地板扮演着不可或缺…...

【ARM】MDK如何生成指定大小的bin文件,并指定空区域的填充数据

1、 文档目标 解决MDK如何生成指定大小的bin文件&#xff0c;并指定空区域的填充数据 2、 问题场景 客户有这样的需求&#xff0c;客户本身的工程编译生成bin文件后&#xff0c;bin文件大小为200k。整体芯片的内存有512k。客户想要最终生成的bin文件可以达到512k的一个情况&a…...