Linux操作系统 使用共享内存实现进程通信和同步
共享内存使用
//main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){ exit(1);} strcpy(s,"hello");shmdt(s);exit(0);
}//test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){ exit(1);} printf("%s",s);shmdt(s);shmctl(shmid,IPC_RMID,NULL);exit(0);
}
进程a从键盘循环获取数据并拷贝到共享内存中,进程b从共享内存中获取并打印数据。要求a输入一次,b输出一次。a不输入,b也不输出
//main.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);//这里加上IPC_EXCL也可以,去掉也可以assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){ exit(1);} // strcpy(s,"hello");while(1){printf("input:\n");char buff[128]={0};fgets(buff,128,stdin);strcpy(s,buff);if(strncmp(buff,"end",3)==0){ break;} }shmdt(s);exit(0);
}//test.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){ exit(1);} // printf("%s",s);while(1){if(strncmp(s,"end",3)==0){ break;} printf("read:%s\n",s);sleep(1);}shmdt(s);shmctl(shmid,IPC_RMID,NULL);exit(0);
}
上面代码会出现问题,会发现如果不sleep(1),他就会一直打印下去。所以共享内存,必须结合信号量一起使用
//sem.h
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/sem.h>
#define SEM1 0
#define SEM2 1
#define SEM_MAX 2
union semun
{int val;
};void sem_init();
void sem_p(int index);
void sem_v(int index);
void sem_destroy();//sem.c
#include "sem.h"
static int semid=-1;
void sem_init()
{semid=semget((key_t)1234,SEM_MAX,IPC_CREAT|IPC_EXCL|0600);if(semid==-1){semid=semget((key_t)1234,SEM_MAX,0600);if(semid==-1){printf("sem failed!\n");return ;}}else{union semun a;int arr[SEM_MAX]={1,0};for(int i=0;i<SEM_MAX;i++){a.val=arr[i];if(semctl(semid,i,SETVAL,a)==-1){printf("semctl setval failed\n");}}}
}void sem_p(int index)
{if(index<0||index>=SEM_MAX){return ;}struct sembuf a;a.sem_num=index;a.sem_op=-1;a.sem_flg=SEM_UNDO;if(semop(semid,&a,1)==-1){printf("semop p error!\n");}
}
void sem_v(int index)
{if(index<0||index>=SEM_MAX){return ;}struct sembuf a;a.sem_num=index;a.sem_op=1;a.sem_flg=SEM_UNDO;if(semop(semid,&a,1)==-1){printf("semop v error!\n");}
}void sem_destroy()
{if(semctl(semid,0,IPC_RMID)==-1){printf("destroy error!\n");}
}//main.c
#include <string.h>
#include "sem.h"
#include <sys/shm.h>int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){ exit(1);} // strcpy(s,"hello");char buff[128];sem_init();while(1){printf("input:\n");memset(buff,128,0);fgets(buff,128,stdin);sem_p(SEM1);strcpy(s,buff);sem_v(SEM2);if(strncmp(buff,"end",3)==0){ break;} }shmdt(s);exit(0);
}//b.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/shm.h>
#include <string.h>
#include "sem.h"
int main()
{int shmid=shmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!=-1);char *s=(char *)shmat(shmid,NULL,0);// assert(s!=NULL);if(s==(char *)-1){ exit(1);} // printf("%s",s);sem_init();while(1){sem_p(SEM2);if(strncmp(s,"end",3)==0){ break;} printf("read:%s\n",s);sem_v(SEM1);}shmdt(s);sem_destroy();shmctl(shmid,IPC_RMID,NULL);exit(0);
}
相关文章:

Linux操作系统 使用共享内存实现进程通信和同步
共享内存使用 //main.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <assert.h> #include <sys/shm.h> #include <string.h> int main() {int shmidshmget((key_t)1234,256,IPC_CREAT|0600);assert(shmid!-1);…...

如何优化微信小程序中渲染带有图片的列表(二进制流存储方式的图片存在本地数据库)
方法一:对列表的获取进行分页处理 实现方法: 前端请求(需要向后端传两个参数,pageIndex是获取第几页是从0开始,pageSize是这一页需要获取多少个数据) 后端接口实现(因为这里是通过参数拼接请求…...

尝鲜纯血鸿蒙,华为国际版本暂时不支持升级。如mateX6 国际版?为什么不支持?什么时候支持?
一:mateX6 国际版支持鸿蒙吗? 不支持 二:华为国际版支持鸿蒙吗? 不支持 三:华为国际版什么时候支持? 2025年预期可以支持。请耐心等待。 三:国际版为什么不支持? EMUI 采用AO…...
《 PyTorch 2.3革新:torch.compile自动生成CUDA优化内核全解》
CUDA作为NVIDIA推出的并行计算平台和编程模型,为GPU计算提供了强大的支持,但手动优化CUDA代码不仅需要深厚的专业知识,而且过程繁琐、耗时费力,torch.compile的出现,犹如一道曙光,为解决这一困境带来了全新…...
OpenCV中的分水岭算法 (C/C++)
OpenCV中的分水岭算法 (C/C) 🏞️ 分水岭算法 (Watershed Algorithm) 是一种在图像处理和计算机视觉中广泛应用的图像分割方法。它特别适用于分离图像中相互接触或重叠的对象。其基本思想是将灰度图像看作一个地形景观,其中灰度值代表海拔高度。算法模拟…...
Kafka 客户端连接机制的一个典型陷阱
这是 Kafka 客户端连接机制的一个典型陷阱,你遇到的现象可以通过 Kafka bootstrap server 的连接策略和 broker 的 advertised.listeners 配置来精确解释。 🎯 问题描述简化 ✅ 使用顺序为: 192.168.22.22:9092,192.168.22.23:9092,172.21.16…...
相机--RGB相机
教程 RGB--深度相机--激光雷达 RGB相机 原理: 仅捕获红(R)、绿(G)、蓝(B)三通道的彩色图像,输出2D像素矩阵,无深度信息。 核心作用: 2D视觉任务࿱…...
足球数据全解析:实时数据到高阶数据
一、实时数据 1.基础: 比分 & 时间:最基础也最容易出错,优秀的实时数据源,比分更新时间小于0.5秒 射门/射正:狂射20脚进攻猛?可能是"无效狂轰" 射正3次进2球效率逆天 控球率:…...

[科研实践] VS Code (Copilot) + Overleaf (使用 Overleaf Workshop 插件)
科研圈写文档常用 Latex 环境,尤其是 Overleaf 它自带的 AI 润色工具 Writefull 太难用了。如果能用本地的 CoPilot / Cursor 结合 Overleaf,那肯定超高效! 于是我们找到了 VS Code 里的 Overleaf Workshop 插件。这里已经安装好了࿰…...
人工智能100问☞第36问:什么是BERT?
目录 一、通俗解释 二、专业解析 三、权威参考 BERT是基于Transformer Encoder的双向语言预训练模型,具备强大的语义理解能力,是现代自然语言处理的重要基石。它是一套让机器像人一样“前后一起看”的语言理解技术,它让AI不光“读得快”,还“读得懂”。现在很多搜索引擎…...

从0开始学习R语言--Day12--泊松分布
今天我们来看一个很经典的回归模型:泊松分布。 泊松分布 我们一般会把泊松分布用于预测问题,比如想知道成年人每天接到的骚扰电话次数,医院每天的急诊病人等。但在一些方面,跟我们想的会有出入。例如你不能将其应用在预测下周你的…...

工控机安装lubuntu系统
工控机安装lubuntu系统指南手册 1. 准备 1个8G左右的U盘 下载Rufus: Index of /downloads 下载lubuntu系统镜像: NJU Mirror Downloads – Lubuntu 下载Ventoy工具: Releases ventoy/Ventoy GitHub 下载后,解压&#…...

视频监控汇聚平台EasyCVR安防小知识:如何通过视频融合平台解决信息孤岛问题?
一、项目背景与需求分析 随着数字化技术发展与网络带宽升级,视频技术应用场景不断拓展,视频监控、记录仪等多样化产品构建起庞大体系。但这些独立系统彼此割裂,形成信息孤岛。 在系统集成项目中,视频系统深度融合已成必然趋势…...

在大型中实施访问控制 语言模型
大家读完觉得有帮助记得关注!!! 抽象 在企业设置中,组织数据是隔离的、孤立的 并受到精心设计的访问控制框架的精心保护。 如果 LLM 对 siloed data serve 请求进行微调,用于下游任务, 来自具有不同访问权限…...

Haption在危险、挑战性或受限环境中操作的情况提供了一种创新的遥操作解决方案
Haption Virtuose 6D TAO是一款拥有7个主动自由度的触觉设备,专为虚拟现实环境交互而设计。 它与Virtuose的一系列软件解决方案兼容,可让您直接在CAD软件中使用该设备进行装配仿真,并在3D游戏引擎中使用该设备,从而打造更加逼真的…...
html中使用nginx ssi插入html
1.使用方法 nginx配置: server {listen 80;server_name example.com;location / {root /var/www/html;index index.html;ssi on; # 开启 SSI 功能ssi_types text/html; # 指定哪些类型的文件启用 SSI,默认只有 text/html} }html内容: &l…...

行为型:状态模式
目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、注意事项 1、核心思想 目的:将状态相关逻辑封装到独立的类中,消除复杂的条件分支,状态的切换由具体状态类自身管理 举例: 1>…...

优雅草最新实战项目技术Discuz X3.5电子签约插件开发项目实施方案优雅草·卓伊凡
优雅草最新实战项目技术Discuz X3.5电子签约插件开发项目实施方案优雅草卓伊凡 一、项目概述 甲方需求:为现有Discuz X3.5系统集成电子签约功能,对接e签宝API,实现用户发起/签署合同、模板管理、签约记录查询等功能。 总预算:9,3…...
人工智能在智能金融中的创新应用与未来趋势
随着金融科技的快速发展,人工智能(AI)技术正在深刻改变金融服务的各个方面。从风险评估到投资决策,从客户服务到欺诈检测,AI的应用不仅提高了金融服务的效率和准确性,还为用户带来了更加个性化和便捷的体验…...
LeetCode:贪心算法
目录 一、分发饼干 二、摆动序列 三、最大子数组和 四、买卖股票的最佳时机II 五、跳跃游戏 六、跳跃游戏II 七、K次取反后最大化的数组和 八、加油站 九、分发糖果 十、柠檬水找零 十一、根据身高重建队列 十二、用最少数量的箭引爆气球 十三、无重叠区间 十四、…...

基于本地化大模型的智能编程助手全栈实践:从模型部署到IDE深度集成学习心得
近年来,随着ChatGPT、Copilot等AI编程工具的爆发式增长,开发者生产力获得了前所未有的提升。然而,云服务的延迟、隐私顾虑及API调用成本促使我探索一种更自主可控的方案:基于开源大模型构建本地化智能编程助手。本文将分享我构建本…...

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.8 R语言解题
本文是实验设计与分析(第6版,Montgomery著,傅珏生译) 第5章析因设计引导5.7节思考题5.8 R语言解题。主要涉及方差分析,正态假设检验,残差分析,交互作用图。 (a) dataframe<-data.frame( Lightc(580,568…...

引领机器人交互未来!MANUS数据手套解锁精准手部追踪
MANUS数据手套为机器人技术带来高精度手部追踪,助力实现人与机器的自然交互!近年,越来越多客户希望利用这项技术精准操控机械臂、灵巧手和人形机器人,不断提升设备的智能化水平和交互体验。 MANUS数据手套是高精度人机交互设备&am…...
HarmonyNext使用request.agent.download实现断点下载
filedownlaod(API12) 📚简介 filedownload 这是一款支持大文件断点下载的开源插件,退出应用程序进程杀掉以后或无网络情况下恢复网络后,可以在上次位置继续恢复下载等 版本更新—请查看更新日志!!! 修复已知bug,demo已经更新 Ὅ…...
《重塑认知:Django MVT架构的多维剖析与实践》
MVT,即Model - View - Template,是Django框架独特的架构模式。它看似简单的三个字母,实则蕴含着深刻的设计哲学,如同古老智慧的密码,解开了Web应用开发的复杂谜题。 模型,是MVT架构中的数据核心࿰…...
JS入门——三种输入方式
JS入门——三种输入方式 一、方式一:直接在警告框弹出(window可以省略) <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script><!-- 方式一直接在警告框弹…...

源的企业级网络安全检测工具Prism X(棱镜X)
Prism X(棱镜X)是由yqcs团队自主研发的开源网络安全检测解决方案,专注于企业级风险自动化识别与漏洞智能探测。该工具采用轻量化架构与跨平台设计,全面兼容Windows、Linux及macOS操作系统,集成资产发现、指纹鉴别、弱口…...

基于FPGA的二叉决策树cart算法verilog实现,训练环节采用MATLAB仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) MATLAB训练结果 上述决策树判决条件: 分类的决策树1 if x21<17191.5 then node 2 elseif x21>17191…...
mac电脑安装nvm
方案一、常规安装 下载安装脚本:在终端中执行以下命令来下载并运行 NVM 的安装脚本3: bash curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.39.5/install.sh | bash配置环境变量:安装完成后,需要配置环境变量。如…...

权限分配不合理如何影响企业运营?
“我们明明只给了她CRM的查看权限,怎么客户数据被删了?” “新员工入职三天了,HR系统权限还没开通,流程完全卡住!” “上个月刚给项目经理配了财务权限,怎么又出乱子了?” 这些对话是否在你的…...