使用命名管道对system-v共享内存通信实现同步机制
所谓同步机制关心的就是谁先谁后的问题本次设计代码利用读端open后只有写端打开才会读否则就会堵塞其次在client写入共享内存后才会执行write,去唤醒read,否则read会一直读到0阻塞在while循环中不会去读。架构图如下实现建立命名管道以及共享内存如下com.h// 声明信道 #pragma once #include stdio.h #include stdlib.h #include unistd.h #include sys/types.h #include sys/ipc.h #include sys/shm.h #include sys/stat.h #include errno.h #include fcntl.h #define Path . #define proj_id 0x0666 #define SHM_SIZE 4096 #define ERR_TYPE(m) \ do \ { \ perror(m); \ exit(EXIT_FAILURE); \ } while (0) // 建立共享内存 int create_shm(size_t size); // 销毁共享内存 int destroy_shm(int shmid); // 获取共享内存 int get_shm(size_t size); // 链接共享内存 void *attach_shm(int shmid); // 断开共享内存 void detach_shm(void *shmaddr); //创建命名管道实现同步 int create_pipe(char *pipe_name, mode_t mode);com.c#include com.h // 建立共享内存 static int commshm(size_t size, int flags); int create_shm(size_t size) { umask(0); return commshm(size, IPC_CREAT | IPC_EXCL | 0666); } // 该实现函数本地私有化 static int commshm(size_t size, int flags) { key_t key ftok(Path, proj_id); if (key -1) { ERR_TYPE(ftok); return -1; } int shmid 0; if ((shmid shmget(key, size, flags)) -1) { ERR_TYPE(shmget); return -2; } return shmid; } // 销毁共享内存 int destroy_shm(int shmid) { if (shmctl(shmid, IPC_RMID, NULL) -1){ ERR_TYPE(shmctl); return -3; } return 0; } // 获取共享内存 int get_shm(size_t size) { return commshm(size, 0); } // 链接共享内存 void *attach_shm(int shmid) { if(shmat(shmid, NULL, 0) (void *)-1){ ERR_TYPE(shmat); return (void*)-4; } return shmat(shmid, NULL, 0); } // 断开共享内存 void detach_shm(void *shmaddr) { if(shmdt(shmaddr) -1){ ERR_TYPE(shmdt); } } //创建命名管道实现同步 int create_pipe(char *pipe_name, mode_t mode){ if(mkfifo(pipe_name, mode) -1){ ERR_TYPE(mkfifo); return -1; } return 0; }sever.c//服务端建立共享内存信道 #include com.h int main(){ //创建共享内存返回内存数组值 int shmid create_shm(SHM_SIZE); //链接共享内存 char* addr attach_shm(shmid); //创建命名管道实现互斥 int retcreate_pipe(my_pipe, 0666); if(ret -1){ ERR_TYPE(create_pipe); return -1; } sleep(2); //打印用户写进来的数据 int i40; printf(写端打开等待读端:\n); int rfdopen(my_pipe, O_RDONLY); printf(服务端接收数据中:\n); if(rfd -1){ ERR_TYPE(ropen); return -1; } char* buffer[40]{0}; //read唤醒 //如果写端没写完就阻塞 printf(等待写端阻塞中.............\n); while(i--read(rfd, buffer, 2) 0){ //提取共享内存到输出流 printf(用户发来: %s\n, addr); fflush(stdout); sleep(1); } printf(服务端接收数据完成\n); //分离共享内存 detach_shm(addr); printf(分离共享内存\n); sleep(1); //删除共享内存 destroy_shm(shmid); printf(删除共享内存\n); sleep(1); //删除命名管道 close(rfd); unlink(my_pipe); printf(删除命名管道\n); sleep(1); }client.c//客户端获取共享内存信道 #include com.h int main(){ //获取共享内存 int shmid get_shm(SHM_SIZE); //链接共享内存 char* addr attach_shm(shmid); char* baseaddr; sleep(2); //打开读端 printf(打开读端:\n); int rfdopen(my_pipe, O_WRONLY); if(rfd -1){ ERR_TYPE(wopen); return -1; } //用户写数据 int i65; printf(用户写入数据中:\n); sleep(5); char* buffer[40]{0}; while(i90){ snprintf(addr,SHM_SIZE, %c, i); snprintf(addr1,SHM_SIZE, %c, i); write(rfd, buffer, 2); printf(写端写入唤醒读进程\n); i; addr2; sleep(1); } printf(用户写入数据完成\n); sleep(2); //分离共享内存 detach_shm(base); sleep(1); printf(用户分离共享内存\n); //关闭管道文件描述符 close(rfd); sleep(1); printf(用户关闭管道文件描述符\n); return 0; }MakefileCC : gcc CFLAGS : -Wall -Wextra -stdc11 -g all: client server client: client.c com.c com.h $(CC) $(CFLAGS) -o client client.c com.c server: server.c com.c com.h $(CC) $(CFLAGS) -o server server.c com.c clean: rm -f client server .PHONY: all clean运行结果如下

相关新闻

全美世界口碑怎么样?用户反馈与行业评价综合观察

全美世界口碑怎么样?用户反馈与行业评价综合观察

全美世界口碑怎么样?用户反馈与行业评价综合观察 在消费决策中,"口碑"往往比广告更有说服力。一个人说"我用了很好",比十句"我们的产品很好"都有用。配图1 全美世界品牌传播很大程度上依赖口碑。这决定了它的口…

2026/8/6 8:47:10 阅读更多 →
Unity LLMUnity插件脚本开发实战:从架构解析到性能优化

Unity LLMUnity插件脚本开发实战:从架构解析到性能优化

1. 项目概述:当Unity遇上LLM,一场关于脚本的深度探索如果你正在Unity里捣鼓LLMUnity这个插件,想给游戏角色注入点“灵魂”,结果发现脚本这块儿水有点深,那你来对地方了。我最近也在一个项目里深度折腾LLMUnity&#xf…

2026/8/6 8:47:10 阅读更多 →
Unity Shader进阶:从Phong到PBR的BRDF光照模型实现与调试

Unity Shader进阶:从Phong到PBR的BRDF光照模型实现与调试

1. 项目概述:从“看得懂”到“写得对”的Shader进阶之路 如果你已经跟着《Unity Shader 入门精要》这本书啃到了第9章,恭喜你,你已经不再是那个对着Shader代码一脸懵的新手了。前面的章节,我们像是在学习一门新语言的语法和单词&a…

2026/8/6 8:46:10 阅读更多 →

最新新闻

Spring Boot配置管理进阶:@ConfigurationProperties与@PropertySource深度解析

Spring Boot配置管理进阶:@ConfigurationProperties与@PropertySource深度解析

1. 从“硬编码”到“优雅配置”的进化之路 如果你是从Spring Boot 1.x时代一路走过来的开发者,肯定对 application.properties 里密密麻麻的配置项记忆犹新。那时候,我们获取配置最直接的方式就是 Value("${some.key}") ,简单粗…

2026/8/6 9:46:42 阅读更多 →
Java AI Agent开发实战:仿AgentScope框架实现与Harness工程解析

Java AI Agent开发实战:仿AgentScope框架实现与Harness工程解析

如果你正在寻找一个能快速上手、深入理解现代AI Agent开发框架的实战项目,那么这篇文章就是为你准备的。最近,一个名为“仿OpenClaw的AgentScope 2.0 Java项目 个人版”的项目在开发者社区中引起了不小的关注。它不像那些动辄需要庞大算力、复杂配置的AI…

2026/8/6 9:46:42 阅读更多 →
维吉尼亚密码攻防实战:从原理到四种经典破译方法详解

维吉尼亚密码攻防实战:从原理到四种经典破译方法详解

1. 项目概述:从古典密码到实战攻防 维吉尼亚密码,这个名字对于很多刚接触密码学的朋友来说,可能既熟悉又陌生。熟悉是因为它常常作为“凯撒密码的升级版”出现在各种入门教程里;陌生则在于,一旦真正动手去分析它&#…

2026/8/6 9:46:42 阅读更多 →
2027 年 1 月起谷歌停支第三方账户发邮件,Gmail 部分功能将停用

2027 年 1 月起谷歌停支第三方账户发邮件,Gmail 部分功能将停用

谷歌 2027 年调整 Gmail 第三方邮件功能据 Android Authority 报道,自 2027 年 1 月起,谷歌将有一系列针对 Gmail 的调整。其中包括停止支持从雅虎、Outlook 等第三方账户发送电子邮件,同时停用 Gmailify 功能以及在 Gmail 中从第三方账户获取…

2026/8/6 9:46:42 阅读更多 →
FlutterFlow团队推出免费工具Campus:告别上下文切换,开启二维工作新体验!

FlutterFlow团队推出免费工具Campus:告别上下文切换,开启二维工作新体验!

上下文切换的时代几年前,开发工作组织简单,规划后一两周专注开发。智能代码编写工具改变一切,并行工作成常态,代价是上下文切换,让软件工程工作更累。我为什么把智能体放进《我的世界》过去一年热衷探索工作上下文环境…

2026/8/6 9:46:42 阅读更多 →
别再瞎降重!✅这款靠谱AI论文软件,才是论文降重的正确打开方式

别再瞎降重!✅这款靠谱AI论文软件,才是论文降重的正确打开方式

写论文最崩溃的瞬间:查重一飘红,改完又超标,降重完逻辑全乱😭 很多同学为了降重,换了无数个AI论文工具,结果踩坑不断!要么机械换词、句子不通顺,要么改完数据出错、专业术语乱改&am…

2026/8/6 9:45:42 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →