使用命名管道对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/9/28 16:48:51 阅读更多 →
Unity LLMUnity插件脚本开发实战:从架构解析到性能优化

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

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

2026/9/28 2:30:58 阅读更多 →
Unity Shader进阶:从Phong到PBR的BRDF光照模型实现与调试

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

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

2026/10/3 4:54:07 阅读更多 →

最新新闻

RK3588安卓系统预装输入法内置指南:从mk文件到实战踩坑

RK3588安卓系统预装输入法内置指南:从mk文件到实战踩坑

1. 同样是"预装",为什么有的输入法出厂后却"消失"了 做RK3588安卓方案开发的朋友,大概率都遇到过这种情况:给客户演示样机的时候,把设备恢复出厂设置,结果预装的第三方输入法没了,或者…

2026/10/3 18:54:44 阅读更多 →
QuickBlue是什么:企业级AI应用底座的核心价值与落地经验

QuickBlue是什么:企业级AI应用底座的核心价值与落地经验

这几年做企业数字化相关的朋友,好多人都开始问我同一个问题:QuickBlue到底是什么?说实话,我第一次听到这个词的时候,也习惯性地把它当成又一家做大模型API的公司。但深入了解之后,我逐渐意识到,…

2026/10/3 18:54:44 阅读更多 →
AI辅助接口设计与异常处理:小项目实战的工程化之路

AI辅助接口设计与异常处理:小项目实战的工程化之路

小项目实战系列写到第二篇了。上一篇我们搭了一个能跑的最小系统,但说实话,越往后做,越发现真正让项目变“工程化”的不是功能和页面,而是接口设计和异常处理这两块。这俩东西平时不起眼,一旦线上出问题,全…

2026/10/3 18:54:44 阅读更多 →
Unity AssetBundle热更新安全排查:从CDN到本地缓存的完整指南

Unity AssetBundle热更新安全排查:从CDN到本地缓存的完整指南

1. 热更新链条上最容易出事的三个环节 先说个真实场景。有一次线上版本发完热更包,运营那边反馈有大概 3% 的玩家卡在启动资源加载界面,日志里全是 AssetBundle 加载超时和 CRC 校验失败。当时第一反应是 CDN 节点出了问题,结果查了一圈&…

2026/10/3 18:54:44 阅读更多 →
昆仑通态触摸屏自由口通讯实战:从原理到变频器电压监视

昆仑通态触摸屏自由口通讯实战:从原理到变频器电压监视

做设备改造那阵子,现场一台老款变频器要接昆仑通态触摸屏,翻了一圈内置驱动列表,愣是找不到对应品牌。有人说换PLC,有人说换触摸屏,最后让我解决的,其实是个很多人听过但不敢碰的功能——自由串口通讯。搞工…

2026/10/3 18:54:43 阅读更多 →
AI Agent工具接入层设计:订阅路由与代理式认证注入实战

AI Agent工具接入层设计:订阅路由与代理式认证注入实战

如果你手头正在搞 AI Agent,那你早晚会撞上这样一个场景:Agent 本身没写几行,工具接入却写了两千行。大模型决定的是上限,工具接入决定的是下限,真正让 Agent “下地干活”的那一层,往往被各种 API 密钥、供…

2026/10/3 18:53:43 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →