来了来了
1.序言
这一章,我们就来看看进程间通信,程序和系统的运作都离不开进程之间的通信。
进程间通信一般是为了以下几点:
数据传输:进程间的数据传输。
资源共享:将指定的资源共享给多个进程。
通知事件:进程工作时,也需要通知其它一个或一组进程,告诉它们发送了什么事件(进程结束时要通知其父进程)。
进程控制:有时我们需要一个进程部分或完全控制另一个进程,拦截其它进程所有陷入和异常的状态,以及时的知道该进程的状态,例如:debug时。
进程间通信主要有这几种:
管道:又分为匿名管道和命名管道。
System V IPC:System V消息队列、System V共享内存、System V信号量。
POSIX IPC:消息队列、共享内存、信号量、互斥量、条件变量、读写锁。
IPC(Inter-Process Communication,进程间通信) 是计算机操作系统中,不同进程之间交换数据或同步操作的机制。它允许独立运行的进程(可能由不同用户或程序创建)协调工作,共享资源或传递信息,从而构建复杂的分布式或并行系统。
2.管道
2.1匿名管道
需要包的头文件
#include
函数功能:创建一个匿名管道
int pipe(int fd[2]);
参数:传入一个文件描述符数组,fd[0]表示读端,fd[1]表示写端。
成功返回0,失败返回错误代码。
//从键盘输入,再从管道读取。
#include
#include
#include
#include
int main()
{
int fd[2];
char buffer[233];
int len;
if(pipe(fd) == -1)
{
perror("make pipe");
exit(1);
}
while(fgets(buffer, 233, stdin))
{
len = strlen(buffer);
if(write(fd[1], buffer, len) != len)
{
perror("write pipe");
exit(1);
}
memset(buffer, 0, sizeof(buffer));
if((len = read(fd[0], buffer, sizeof(buffer))) == -1)
{
perror("read pipe");
exit(1);
}
if(write(1, buffer, len) == -1)
{
perror("write stdout");
exit(1);
}
}
return 0;
}
若要父子间进程通信,可参看下图↓
再关闭父进程或子进程的读端或写端,就可实现一方负责读,一方负责写。
父子进程的文件描述符如下
↓从内核的角度来看就是↓
从这里可以看出,管道其实也被抽象成了文件,内核通过file_operation来调用管道相关的接口。
2.1.1匿名管道的读写以及特点
当管道没有数据可读时(读相关):
未设置O_NONBLOCK:read函数会被阻塞,即进程会被暂停执行,直到有数据可读为止。
设置了O_NONBLOCK:read调用会返回-1,errno的值会被设置为EAGAIN。
当管道数据已满时(写相关):
未设置O_NONBLOCK:write同样会被阻塞,直到可以写入为止。
设置了O_NONBLOCK:write调用同样会直接返回-1,并将errno设置为EAGAIN。
EAGAIN是:Linux/Unix 系统中的一个错误码(errno),表示资源暂时不可用,但稍后重试可能成功。可以理解为“资源暂时不可用,稍后再试”。
如果管道所有写端的文件描述符被关闭,read函数会返回0。
如果管道所有读端的文件描述符被关闭,write函数会产生SIGPIPE信号,进而可能会使write进程退出。
当要写入的数据量不大于PIPE_BUF时,linux将保证写入的原子性。
当要写入的数据量大于PIPE_BUF时,linux将不再保证写入的原子性。 PIPE_BUF通常为4KB或512B,取决于系统。
匿名管道一般只能用于有共同祖先(具有亲缘关系,如父子进程)进程的通信,一般是一个进程创建管道,然后调用fork函数,之后父子进程就可以通信了。
管道(Pipe)提供流式服务,意味着它以连续、无固定边界的数据流形式传输数据,而非一次性传输完整的数据块。它具有先进先出的特点,有点像水流(字节流)。可以用两个管道来实现全双工(同时进行写或读)。
管道是半双工的,即只能双方交替进行数据传输,不能同时进行读或写,内核会对管道操作进行同步和互斥,并且一般管道的生命周期同进程一样。
2.2命名管道
匿名管道还是不方便,只能用于有亲缘关系进程间的通信,有没有更强的呢?
有的兄弟,有的。命名管道就是一个解决方案,我们可以创建FIFO文件来完成这份工作,FIFO文件就是命名管道。
Shell或者控制台可以用这串指令创建命名管道
mkfifo filename(文件名)
#include // 提供系统数据类型定义(如mode_t)
#include // 提供文件模式和权限相关定义(如S_IRUSR、S_IWUSR等)
int mkfifo(const char* pathname, mode_t mode);
参数:
pathname:有名管道的路径名(如 "/tmp/my_fifo")。
mode:设置管道文件的权限(如 0666 表示所有用户可读写)。
成功时返回 0,失败时返回 -1 并设置 errno。
删除管道文件要使用unlink()函数:
#include // 包含 unlink() 的声明
int unlink(const char *pathname);
参数:
pathname:为要删除的文件或符号链接的路径。
创建好管道后可以使用open()函数来操作,就行文件操作一样。
命名管道与匿名管道的区别:创建、删除和打开略有区别,除此之外几乎没有不同。
2.2.1命名管道的打开规则
如果当前为读打开FIFO文件:
设置O_NONBLOCK:open()函数会阻塞,直到有进程以写打开。
未设置O_NONBLOCK:直接返回成功。但后续read()会返回-1,并设置errno为EAGAIN。
如果当前为写打开FIFO文件:
设置O_NONBLOCK:open()函数会阻塞,直到有进程以读打开。
未设置O_NONBLOCK:直接失败返回-1,errno设置为ENXIO。
目的:确保数据生产者(写端)和数据消费者(读端)同时存在,避免无效操作。
3.System V共享内存
System V共享内存是最快的IPC方式,只要将内存映射到目标进程的地址空间内,之后的数据传输就不再需要进入内核的系统调用,即不再涉及内核。
↓内核中的数据结构↓
/* Obsolete, used only for backwards compatibility and libc5 compiles */
struct shmid_ds {
struct ipc_perm shm_perm; /* operation perms */
int shm_segsz; /* size of segment (bytes) */
__kernel_time_t shm_atime; /* last attach time */
__kernel_time_t shm_dtime; /* last detach time */
__kernel_time_t shm_ctime; /* last change time */
__kernel_ipc_pid_t shm_cpid; /* pid of creator */
__kernel_ipc_pid_t shm_lpid; /* pid of last operator */
unsigned short shm_nattch; /* no. of current attaches */
unsigned short shm_unused; /* compatibility */
void *shm_unused2; /* ditto - used by DIPC */
void *shm_unused3; /* unused */
};
System V共享内存所需函数:
定义System V IPC(进程间通信)相关的结构体和常量(如key_t类型、IPC_CREAT、IPC_EXCL等标志)。
#include
包含共享内存函数的声明及共享内存状态结构体(如struct shmid_ds)的定义。
#include
定义基本数据类型(如key_t、size_t),这些类型在共享内存操作中用于标识键值和内存大小。
#include
提供ftok函数(用于生成唯一的键值key_t)
#include
//用于创建共享内存
int shmget(key_t key, size_t size, int shmflg);
参数:
key:这个共享内存段名字。
size:共享内存大小。
shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
取值为IPC_CREAT:共享内存不存在,创建并返回;共享内存已存在,获取并返回。
取值为IPC_CREAT | IPC_EXCL:共享内存不存在,创建并返回;共享内存已存在,出
错返回。
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1
-------------------------------------------------------------------------------------
//将共享内存映射到进程地址空间
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
shmid: 共享内存标识。
shmaddr:指定连接的地址。
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY。
返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1。
注:
1.如果shmaddr为NULL,有系统选择地址。
2.shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址。
3.shmaddr不为NULL且shmflg设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。
公式:shmaddr - (shmaddr % SHMLBA)。
4.shmflg=SHM_RDONLY,表示连接操作用来只读共享内存。
-------------------------------------------------------------------------------------
//让当前进程与共享内存脱离,但不等于删除共享内存片段
int shmdt(const void *shmaddr);
参数:
shmaddr: 由shmat所返回的指针。
返回值:成功返回0;失败返回-1。
-------------------------------------------------------------------------------------
//控制共享内存
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
shmid:由shmget返回的共享内存标识码。
cmd:将要采取的动作(有三个可取值)。
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构。
返回值:成功返回0;失败返回-1。
cmd参数的取值:
IPC_STAT: 获取共享内存段的状态信息,将内核中的struct shmid_ds数据复制到用户空间的buf指针指向的结构体中。(需要当前进程有共享内存的读权限)
IPC_SET: 修改共享内存的属性(如权限、所有者ID等)。
仅允许修改struct shmid_ds中的以下字段:
shm_perm.uid(所有者用户ID)
shm_perm.gid(所有者组ID)
shm_perm.mode(权限位,仅低9位有效)。
需要当前进程的用户ID是共享内存的创建者或所有者。
即,改变其他进程(所属其他用户或用户组)的访问权限。
IPC_RMID: 删除共享内存段。内核会标记该段为“待删除”,但实际释放内存需等待所有附加进程分离(通过shmdt)后异步完成。
权限需求与IPC_SET一样。
System V消息队列这里不作详细介绍,可以看看其他佬的博文。
4.System V信号量
System V信号量是一种用于进程间同步与互斥的机制,也属于System V IPC。它通过管理公共资源的访问权限,来协调多个进程对同一份临界区资源的操作,避免数据竞争和不一致的问题。
信号量的本质是:一个非负整数的计数器,用于记录可用资源的数量,我们可以通过P、V操作来对信号量进行操作,实现资源的申请和释放。
一些相关概念:
1.多个执行流(进程)看到的公共资源,称之为共享资源。
2.被保护起来的资源,叫做临界资源。
3.常见的保护方式:同步和互斥。多个执行流,访问临界资源的时候,且有一定的顺序性,为同步。任意时刻,只能有一个执行流访问临界资源,叫做互斥。
4.系统中的某些资源一次只允许一个执行流访问,叫做互斥资源。
5.在程序中涉及到临界资源部分的代码,叫做临界区,代码也可以分为:临界区和非临界区。
所以对共享资源进行保护,实则是在限制访问临界资源的执行流。
信号量:
一元信号量:一个非0即1的计数器,用于互斥锁(用于确保只有一个进程可以进行操作)。
计数信号量:值可以为任何非负整数,用于管理多份同类资源(例如数据库连接池)。
关键操作--P、V操作(P\V操作是原子的,确保多进程并发时的正确性和唯一性):
P操作:用于申请资源,信号量计数器-1。如果计数器<=0,则会阻塞,直到计数器>0才会执行。
V操作:用于释放操作,信号量计数器+1。唤醒一个等待的进程。
核心函数:
#include
//创建或获取信号量集
int semget(key_t key, int nsems, int semflg);
参数:
key:唯一标识信号量集的键值(通常用ftok生成)。
nsems:集中信号量的数量。
semflg:权限标志(如0666)和控制标志(如IPC_CREAT、IPC_EXCL)。
返回值:成功返回信号量集标识符(semid),失败返回-1。
-------------------------------------------------------------------------------------
//控制信号量集
int semctl(int semid, int semnum, int cmd, ...);
参数:
semid:信号量集标识符。
semnum:信号量编号(信号量集中的索引)。
cmd:控制命令(如SETVAL设置初始值、IPC_RMID删除信号量集、GETVAL获取值)。
...:可选参数(如union semun用于SETVAL)。
返回值:成功返回0或特定值,失败返回-1。
-------------------------------------------------------------------------------------
//执行P/V操作
int semop(int semid, struct sembuf *sops, size_t nsops);
参数:
semid:信号量集标识符。
sops:指向struct sembuf数组的指针,定义操作类型(P/V)和信号量编号。
nsops:操作数量(通常为1)。
返回值:成功返回0,失败返回-1。
-------------------------------------------------------------------------------------
定义P/V操作的结构体,是 System V 信号量操作的核心结构体,定义在 头文件中。
struct sembuf {
unsigned short sem_num; // 信号量编号
short sem_op; // 操作值(P:-1,V:+1)
short sem_flg; // 操作标志(如SEM_UNDO)
};
↓需要自己定义↓
用于semctl的SETVAL等命令:
union semun {
int val; // 信号量初始值(SETVAL)
struct semid_ds *buf; // 信号量集属性(IPC_STAT/IPC_SET)
unsigned short *array; // 信号量值数组(GETALL/SETALL)
};
想要深入了解System V更多的信息,可以去查阅相关资料或问问ai。
5.内核中的IPC结构
bro参考的Linux内核版本是linux-5.0-rc3
struct ipc_ids {
int in_use;
unsigned short seq;
struct rw_semaphore rwsem;
struct idr ipcs_idr;
int max_idx;
#ifdef CONFIG_CHECKPOINT_RESTORE
int next_id;
#endif
struct rhashtable key_ht;
};
......
/* used by in-kernel data structures */
struct kern_ipc_perm {
spinlock_t lock;
bool deleted;
int id;
key_t key;
kuid_t uid;
kgid_t gid;
kuid_t cuid;
kgid_t cgid;
umode_t mode;
unsigned long seq;
void *security;
struct rhash_head khtnode;
struct rcu_head rcu;
refcount_t refcount;
} ____cacheline_aligned_in_smp __randomize_layout;
......
/* one msq_queue structure for each present queue on the system */
struct msg_queue {
struct kern_ipc_perm q_perm;
time64_t q_stime; /* last msgsnd time */
time64_t q_rtime; /* last msgrcv time */
time64_t q_ctime; /* last change time */
unsigned long q_cbytes; /* current number of bytes on queue */
unsigned long q_qnum; /* number of messages in queue */
unsigned long q_qbytes; /* max number of bytes on queue */
struct pid *q_lspid; /* pid of last msgsnd */
struct pid *q_lrpid; /* last receive pid */
struct list_head q_messages;
struct list_head q_receivers;
struct list_head q_senders;
} __randomize_layout;
......
/* One queue for each sleeping process in the system. */
struct sem_queue {
struct list_head list; /* queue of pending operations */
struct task_struct *sleeper; /* this process */
struct sem_undo *undo; /* undo structure */
struct pid *pid; /* process id of requesting process */
int status; /* completion status of operation */
struct sembuf *sops; /* array of pending operations */
struct sembuf *blocking; /* the operation that blocked */
int nsops; /* number of operations */
bool alter; /* does *sops alter the array? */
bool dupsop; /* sops on more than one sem_num */
};
......
struct shmid_kernel /* private to the kernel */
{
struct kern_ipc_perm shm_perm;
struct file *shm_file;
unsigned long shm_nattch;
unsigned long shm_segsz;
time64_t shm_atim;
time64_t shm_dtim;
time64_t shm_ctim;
struct pid *shm_cprid;
struct pid *shm_lprid;
struct user_struct *mlock_user;
/* The task created the shm object. NULL if the task is dead. */
struct task_struct *shm_creator;
struct list_head shm_clist; /* list by creator */
} __randomize_layout;
《进击的巨人》
相关文章:
深入解析:轻松Linux-9.进程间通信
深入解析:轻松Linux-9.进程间通信pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...
2025.9.14——1黄1绿
普及/提高- P2278 [HNOI2003] 操作系统 就是模拟,但是机房噪音太大调了好久…… 普及+/提高 P2233 [HNOI2002] 公交车路线 该说果然是老题吗……好简单的DP啊,应该只有黄的水平。...
Ubuntu 中改图片大小
在 Ubuntu 中,可以使用 ImageMagick 工具来调整图片的大小。ImageMagick 是一个强大的图像处理工具,支持多种图像格式和操作。 安装 ImageMagick 首先,您需要安装 ImageMagick。打开终端并输入以下命令: sudo apt-get install imagemagick使用 ImageMagick 缩放图片 安装完…...
认识眼图和眼图的参数
认识眼图 眼图(Eye Diagram)是用余辉方式累积叠加显示采集到的串行信号的比特位的结果,叠加后的图形形状看起来和眼睛很像,故名眼图。眼图的分析是数字系统信号完整性分析的关键之一。 眼图的形成 由于眼图是示波器用余辉方式将采集到的一系列串行信号的多个单位间隔(UI)…...
【芯片设计-信号完整性 SI 学习 1.2 -- loopback 回环测试】 - 实践
【芯片设计-信号完整性 SI 学习 1.2 -- loopback 回环测试】 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New…...
【科研绘图系列】R语言绘制地图和散点图 - 指南
【科研绘图系列】R语言绘制地图和散点图 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !…...
Java NIO 学习小记
Java NIO 学习小记 :Buffer、Channel 与 Selector 在 Java 的 I/O 体系中,NIO(New Input/Output)是对传统 BIO(Blocking I/O)的优化。NIO 提供了更高效的 面向缓冲区、基于通道 的数据处理方式,并且通过 多路复用器(Selector) 实现了单线程处理多个连接的能力。本文简…...
扩展欧几里得算法求乘法逆元
之前学过用快速幂求逆元,条件是当模数 \(p\) 为质数的时候,\(a\) 的逆元就是 \(a^{p - 2}\)。 但相较于扩展欧几里得算法求逆元,适用的范围是比较小的,因为扩展欧几里得算法适用于所有逆元存在的情况。在以下的式子中,模数为 \(m\) 的情况下,\(x\) 就是 \(a\) 的逆元 \[a…...
redis实现缓存3-封装redis工具类
具体实现: CacheClient package com.hmdp.utils;import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.data.re…...
高阻态
高阻态高阻态(High Impedance State,简称 Hi-Z 或 Hi-Z State)是指电路中的某个输出引脚或信号处于一种“关闭”状态,既不提供电流,也不吸收电流。这个状态通常用于三态逻辑(Tri-state Logic)系统中,目的是让该引脚既不会对电路中的其他部分产生影响,也不会消耗功率。…...
鸿蒙应用开发从入门到实战(四):ArkTS 语言概述
ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。 大家好,我是潘Sir,持续分享IT技术,帮你少走弯路。《鸿蒙应用开发从入门到项目实战》系列文章持续更新中,欢迎关注! 一…...
命令模式的深度解析:从标准实现到TPL Dataflow高性能架构
命令模式是对一类对象公共操作的抽象,它们具有相同的方法签名,所以具有类似的操作,可以被抽象出来,成为一个抽象的命令对象。实际操作的调用者就不是和一组对象打交道,它是需要以来这个命令对象的方法签名,并根据这个签名调用相关的方法。 以上是命令模式的大概含义,这里…...
ORA-01555系列:二、ORA-01555的场景分析与解决方案
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本章将深入探讨ORA-01555的四种核心触发场景,为每种场景提供两个详细的…...
PySimpleGUI常用控件
PySimpleGUI常用控件序号 控件类型 控件函数1 文本控件 1-1:sg.Text() 或者 sg.T()1-2:sg.Input() 或 sg.In() 或 sg.InputText()(文本输入框)1-3:sg.Listbox()(多行列表文本框)1-4:sg.Multiline()(大文本框)2 按键控件 2-1:sg.Button() 或 sg.B()(按键)2-2:sg.E…...
202312_QQ_DNS流量
流量分析,DNS流量,pysharkTags:流量分析,DNS流量,pyshark 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202312_QQ_packet1.zip 小张发现公司某台服务器被入侵,经过在服务器上抓包后得到流量文件,请帮忙分…...
读书笔记:为什么数据在磁盘上的存放顺序如此重要?
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学习《Expert Oracle Database Architecture Techniques and…...
Rcc_APBPeriphClockCmd()
Rcc_APBPeriphClockCmd()启用时钟后,外设能工作,而禁用时钟时外设无法工作的原因,主要是因为 时钟系统 是微控制器中控制所有硬件模块运行的基础。外设时钟负责为外设提供必要的运行时钟信号,没有时钟信号,外设就无法进行正常的操作。下面是一些具体的原因: 1. 时钟是外设…...
故障处理:ORA-19809: limit exceeded for recovery files
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。故障处理:ORA-19809: limit exceeded for recovery files 欢迎大家加入…...
25.09.14 与其感慨路难行,不如马上出发
从2025年9月14日起,我将在此博客网站记录本人对于后端开发路线的每日学习进度与感悟。未来有可能学习其他技术栈,同样将保持记录。 目前规划如下,每天做一道leetcode hot100,前期主要目标在于快速学习java技术栈:JavaWeb、Spring、SpringMVC、Mybatis、Redis、SpringBoot、…...
GCC工具链应用学习笔记
GCC工具链应用学习笔记pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 1…...
初始化 MCP 环境 创建 MCP Server (一)
1、进入 python3 的 Miniconda 虚拟环境创建及进入方法,参见: https://www.cnblogs.com/rslai/p/18741276 2、安装 fastmcp 库pip install fastmcp安装成功后执行 pip list | grep fastmcp 可以查看已经安装 fastmcp 。如下图 3、创建 server 项目 A)新建一个目录,例如 m…...
博客园格式设置
一级标题 1 正文 zhengwen 正文 zhengwen 二级标题 1.1 正文 zhengwen 正文 zhengwen print("hello worldhello world"hello world"hello world"hello world"hello world"hello world"hello world"hello world"hello world&q…...
[总结/备赛]备战 CSP-S 2025 初赛总结
被拉到dl24jp集训一整天(我的作业啊啊啊啊啊) 1.排序算法 主要考察稳定性,时间复杂度,原理 1.1.插入排序最佳时间复杂度:\(O(n)\) 最差时间复杂度:\(O(n^2)\) 平均时间复杂度:\(O(n^2)\) 是否稳定:是 1.2.希尔排序(优化插入排序) 就是把元素分组,每组gap个,对gap中的元…...
win11 系统如何进行硬盘分区?固态硬盘怎么分区?SSD 固态硬盘是分区好还是不分区好?
win11 系统如何进行硬盘分区?固态硬盘怎么分区?SSD 固态硬盘是分区好还是不分区好?电脑硬盘分区教程 win11本身就有自带的分区功能,所以不用借肋第三方软件也能分区,下面开始分享分区方法。 win11其实和win10差不多,功能也差不多,如果分区过win10可能都不用学就会。 理解…...
逆序数及其应用
刷手机的时候看到一个逆序数的算法题,刚好又在复习矩阵论,行列式里也有用到逆序数,想到大二时学的逆序数计算算法,回顾了一下,并写下这篇文章记录。 1. 定义 假设有一个排列\(a_1,a_2,\dots,a_n\),如果下标对\(\langle i,j \rangle\)满足\(i \lt j\)而\(a_i > a_j\),…...
豆豆守护如何下载?
豆豆守护是一款保护隐私数据工具软件,为开发者提供完善的测试环境。其每个安卓版本都会进行适配,作为开发者的我们如何对豆豆守护进行下载呢? 传送门:豆豆守护助手...
Java运行时jar时终端输出的中文日志是乱码
运行Jar时在控制台输出的中文日志全是乱码,这是因为cmd/bash默认的编码是GBK,只要把cmd的编码改成UTF-8即可两种方式修改:临时修改和注册表永久修改 临时修改 只对当前的cmd页面有效,关闭后重新打开都会恢复成GBK, 打开cmd,输入以下命令 chcp 65001AI写代码这样既可以更改…...
ZK2真空发生器日常清理
“过滤器”的拆卸方法 1.手拧或者内六角塞进去(不要用圆头,会打滑),顺着箭头方向顺时针旋转90,即可将连接器抽出2.更换滤芯 确保严丝合缝真空发生器滤芯 ZK2-FE1-3-A(1套10个) 产线零件盒3.装回时,逆着箭头旋转至横线与“LOCK”标记重合...
Nacos服务注册与发现
一、前提条件 你已经安装好Nacos客户端 二、添加对于的依赖到pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency><groupId>com.…...
马的遍历
2025.9.14 曹立 题目内容 有一个 \(n \times m\) 的棋盘,在某个点 \((x,y)\) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入描述 输入只有一行四个整数,分别为 \(n,m,x,y\) 输出描述 一个 \(n \times m\) 的矩阵,代表马到达某个点最少要走几步(不能到达…...
20231310王宏邦《密码系统设计》第1周
20231310王宏邦《密码系统设计》第1周 学习内容《Windows C/C++加密解密实战》第 1,2 章:1、第⼀章概念复习; 2、第⼆章主要在 Linux(Ubuntu,openEuler)上把软件更新到最新版(3.0版本以上)。bang@LAPTOP-74GS6JSR:~$ openssl version OpenSSL 3.0.2 15 Mar 2022 (Library: …...
新学期第一次随笔:慢慢学,总会有进步
一、关于我:爱游戏也想学好知识的普通学生 大家好,我是一名大三学生,平时最大的爱好是打《CS:GO》,空闲时也会玩《我的世界》(MC)。打《CS:GO》时喜欢和队友配合冲锋,既是无畏的冲锋手也是冷静的狙击手,每次赢下对局都特别有成就感;玩MC时总爱研究怎么用指令搭一些自动…...
详细介绍:【C语言】第四课 指针与内存管理
详细介绍:【C语言】第四课 指针与内存管理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impo…...
知识点错题整理
1:【子串里面包含空串】12+1=13【一个字符串中任意个连续的字符组成的子序列称为该字符串的子串,则字符串 abcab 有(13 )个内容互不相同的子串】...
202311_陇剑杯预赛_tcpdump
流量分析,应急响应Tags:流量分析,应急响应 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202311_陇剑杯预赛_tcpdump.zip题目描述:攻击者通过暴力破解进入了某Wiki 文档,请给出登录的用户名与密码,以:拼接…...
Linux学习记录(六):添加/删除用户
添加/删除用户 sudo useradd -m -d /home/newuser -s /bin/bash newusersudo passwd newuser新建/删除用户su: Super User即系统管理员 useradd: 新建用户 userdel: 删除用户 passwd : 修改密码...
python 链式调用 合并 __setattr__ __getattribute__ in nested object()
使用场景:bpy.types.Scene与bpy.context.scene部分功能重叠。 def Get(obj, attr: str | Sequence[str], root=False):"""injected recursive getattr, could pollute objects on chain in whole session"""IS_STR = isinstance(attr, str)if I…...
分享一个稳定好用的免费云服务——阿贝云体验
最近在搭建个人小项目,一直在寻找稳定的免费云服务器资源,偶然发现了「阿贝云」,用了几天感觉非常不错,特地来分享一下使用体验。 阿贝云提供了免费虚拟主机和免费云服务器,对于像我这样刚开始学习建站或者想做点小实验的用户来说非常友好。注册流程简单,开通也很快,控制…...
年化439%,回撤7%,卡玛比率62.5,附本地运行的完整策略python代码 - 详解
年化439%,回撤7%,卡玛比率62.5,附本地运行的完整策略python代码 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Couri…...
接口测试---PyMysql
PyMysql数据库操作代码安装 : pip install PyMySQL数据库应用场景校验测试数据 :http请求发送后,明确会修改表中的数据,但响应结果中没体现如删除员工(is_delete字段)构造测试数据 :测试数据使用一次就失效,不能重复使用 : 添加员工(手机号码字段)测试数据在展开测试前无法确定…...
My First Blog
被你发现啦~...
设置基础软件仓库时出错
1.安装源报设置基础软件仓库时出错2.点击【网络和主机名】,把网络设置成静态网络,能够访问外网3.点击【安装源】,在网络上这块输入这个网址 https://update.cs2c.com.cn/NS/V10/V10SP3-2403/os/adv/lic/base/x86_64/ ,之后点【完成】...
linux c应用性能与内存泄露问题排查工具
GCC内置的内存检测工具在 GCC 中,对 -fsanitize=address(AddressSanitizer, ASan)、-fsanitize=leak(LeakSanitizer, LSan) 和 -fsanitize=memory(MemorySanitizer, MSan) 的支持情况如下:-fsanitize=address(AddressSanitizer - ASan)支持:是可用版本:…...
深入解析:AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划视觉定位力控策略
深入解析:AI-调查研究-66-机器人 机械臂 软件算法体系:轨迹规划视觉定位力控策略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...
VS Code快捷键
VS Code 1.通用操作快捷键快捷键 功能Ctrl+Shift+P 打开命令面板Ctrl+Shift+N 新建窗口Ctrl+S 保存Ctrl+P 搜索打开文件2.代码编辑快捷键快捷键 功能Ctrl+Z 撤销Ctrl+Shift+Z 反撤销Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+F 查找Ctrl+H 替换Ctrl+A 全选Shift+Alt+F 格式化代码…...
API安全厂商综合推荐:2025年权威视角下的主流厂商评估与选型指南
API安全厂商综合推荐:2025年权威视角下的主流厂商评估与选型指南基于IDC 2024年度报告,推荐全知科技、奇安信、腾讯云、华为、保旺达,启明星辰、安恒信息,安华金和、美创科技等API安全厂商,适用于金融、政务、运营商等行业客户,支持AI赋能运营提效70%、资产发现纯净度95%…...
基于FPGA的8PSK+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR
1.算法仿真效果 vivado2019.2仿真结果如下(完整代码运行后无水印):设置SNR=10db设置SNR=30db仿真操作步骤可参考程序配套的操作视频。2.算法涉及理论知识概要随着通信技术的不断发展,相位调制技术因其高频谱效率和抗干扰能力而广泛应用于无线通信系统中。其中,8PSK(8相位…...
去去就来
一脚踢开也许从来没有面临过 看着天空就要泪流下 不是为了具体的人 不是为了具体的事 或者说 每个人都是凶手 下雨这天好安静 也不再盼望放晴 扭转时空又如何挽回 时差 禀赋没有破土 在一切都爆发之前 万物缄默 不甘与嫉恨 人性共扭曲 下位者的祈愿 愿你跌入深渊 所谓的思维 究…...
高三试卷
福建省2024-2025学年高三年级下学期模拟(一模&二模&三模)物理试题试卷汇总 https://www.zxxk.com/docpack/3497855.html...
豆包生成C#即梦API HTTP调用实例代码
最近玩即梦AI,文生图,文生视频等等很多玩法都很强大。即梦本身页提供了API。官方文档里有Java, Golang, Python, PHP的SDK,官方也推荐使用SDK,调用SDK会比较省事儿。官方也提供了HTTP请求示例代码,但是也只包括Java, Golang, Python, PHP,没有C#。所以就尝试写个C#调用即…...