Linux操作系统 使用共享内存实现进程通信和同步

article/2025/7/27 20:16:08

共享内存使用

//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);
}


http://www.hkcw.cn/article/SPgQgtvktd.shtml

相关文章

力扣HOT100之动态规划:322. 零钱兑换

这道题和上一道题279.完全平方数的套路是完全一样的&#xff0c;但是这道题不需要我们自己生成物品列表&#xff0c;函数的输入中已经给出了&#xff0c;但是这道题有一个坑&#xff0c;就是我们在初始化dp数组的时候&#xff0c;所有的位置不应该赋值为INT_MAX&#xff0c;因为…

工厂方法模式(Factory Method)深度解析:从原理到实战优化

作者简介 我是摘星&#xff0c;一名全栈开发者&#xff0c;专注 Java后端开发、AI工程化 与 云计算架构 领域&#xff0c;擅长Python技术栈。热衷于探索前沿技术&#xff0c;包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践&#xff0c;乐于分享实战经验与…

π0-FAST-针对VLA模型的高效动作token化技术-2025.1.16-开源

0. 前言 2025年2月4日&#xff0c;π0 和 π0-FAST 一并开源&#xff0c;这个系列许多研究者、企业人士认为落地潜力很大 项目页 论文页 GitHub页 之前已经做了 π0 论文的详解&#xff1a;π0-通用VLA模型-2024.11.13-开源 本文来详解一下 π0-FAST 1. π0-FAST&#xff1…

正点原子Z20 ZYNQ ​​​开发板​​发布!板载FMC LPC、LVDS LCD和WIFI蓝牙等接口,资料丰富!

正点原子Z20 ZYNQ ​​​开发板​​发布&#xff01;板载FMC LPC、LVDS LCD和WIFI&蓝牙等接口&#xff0c;资料丰富&#xff01; 正点原子新品Z20 ZYNQ开发板来啦&#xff01;核心板全工业级设计&#xff0c;主控芯片型号是XC7Z020CLG484-2I。开发板由核心板底板组成&…

SPL做量化----SRMI(动量修正指标)

MI 修正指标&#xff0c;用法参考 MI 动力指数用法。 例如计算浦发银行 2024 年的 SRMI 指标&#xff0c;N 取 9。 代码示例&#xff1a; A160000022024-01-0132024-12-314call("adjustprice.splx", "", call("loadkday.splx", A1, A2,A3) )5…

【油藏地球物理正演软件ColchisFM】如何在实际地震剖面基础上增删地质体开展正演

在实际地震正演过程中&#xff0c;很多油田客户都希望看到在实际地震剖面上如果增加/减少一个砂体&#xff0c;或者仅仅目的层储层变厚/变薄&#xff0c;物性变好/变差&#xff0c;含油性改变地震上会是什么样的响应&#xff0c;而不仅仅是理论的模型&#xff0c;这时常规的正演…

数据库中求最小函数依赖集-最后附解题过程

今天来攻克数据库设计里一个超重要的知识点 —— 最小函数依赖集。对于刚接触数据库的小白来说&#xff0c;这概念可能有点绕&#xff0c;但别担心&#xff0c;咱们一步步拆解&#xff0c;轻松搞定&#x1f4aa;&#xff01; &#xff08;最后fuyou&#xff09; 什么是最小函数…

奇异值分解(SVD):线性代数在AI大模型中的核心工具

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

通信算法之280:无人机侦测模块知识框架思维导图

1. 无人机侦测模块知识框架思维导图, 见文末章节。 2. OFDM参数估计,基于循环自相关特性。 3. 无人机其它参数估计

VScode ios 模拟器安装cocoapods

使用 Homebrew 安装&#xff08;推荐&#xff09; 如果你有 Homebrew&#xff0c;直接用它安装更稳定&#xff1a; brew install cocoapods

特伦斯 S75 电钢琴:重塑演奏美学的至臻之选

在电钢琴产业迈向技术与体验双升级的时代&#xff0c;特伦斯 S75 以颠覆性设计重新定义高端电钢琴的价值标杆。这款集工艺美学、演奏质感与智能科技于一体的乐器&#xff0c;不仅是音乐表达的工具&#xff0c;更是现代生活空间中流动的艺术符号。 一、极简美学与功能主义的完美…

转转的兴衰之路:二手电商的市场观察

在二手电商的江湖中&#xff0c;转转曾是一颗耀眼的明星。2015年&#xff0c;转转在58集团的孵化下应运而生&#xff0c;就像一个初出茅庐的侠客&#xff0c;带着一股闯劲踏入了闲置交易的江湖&#xff0c;最开始就以全品类二手交易为目标&#xff0c;想要在这个市场中打出一片…

5月课程精彩回顾 | 2025高通边缘智能创新应用大赛系列公开课

当边缘计算与人工智能的碰撞掀起技术革命浪潮&#xff0c;如何抢占创新先机&#xff1f;2025高通边缘智能创新应用大赛以行业顶尖资源赋能开发者&#xff0c;在初赛阶段重磅打造系列公开课。 5月13日至29日&#xff0c;大赛主办方高通技术公司携手承办方阿加犀&#xff0c;以及…

PostIn V1.1.2版本发布,新增接口评审功能,提升接口质量与合理性

PostIn是一款国产开源免费的接口关联工具&#xff0c;包含项目管理、接口调试、接口文档设计、接口数据MOCK等模块&#xff0c;支持常见的HTTP协议、websocket协议。本周PostIn V1.1.0版本发布&#xff0c;新增接口评审、接口统计功能。 1、版本更新日志 新增 ➢ 接口评审&a…

AI互联网辅助工具

Date: 2025-05-30 14:35:24 author: lijianzhan 目前的人工智能在对话聊天&#xff0c;编程&#xff0c;音乐制作&#xff0c;办公&#xff0c;短视频制作&#xff0c;教育等领域有多种辅助工具&#xff0c;这些工具能够显著提升教学和学习效率&#xff0c;下面将介绍目前比较火…

PCIe— Legacy PCI

Legacy Model ​​ 该器件通过将其引脚置位到控制器来生成中断。 在较旧的系统中&#xff0c;这个控制 器通常是Intel 8259 PIC&#xff0c;有15个IRQ输入和一个INTR输出。 然后&#xff0c;PIC将断 言INTR以通知CPU一个或多个中断正在挂起。 一旦CPU检测到INTR的断言…

Cursor简要使用说明

1 Cursor部署 1.1 Cursor安装 默认是Pro账号的试用版(14天)。默认250次快速访问次数&#xff0c;gpt-4o-mini访问无限制&#xff0c;2000次自动补全。Pro自动补全无限制&#xff0c;500次大模型快速请求。 网页链接&#xff1a;https://www.cursor.com/cn&#xff0c;在网页端…

【实例】事业单位学习平台自动化操作

目录 一、创作背景: 二、实现逻辑: 三、代码分析【Deepseek分析】: 1) 主要功能 2)核心组件 2.1 GUI界面 (AutomationApp类) 2.2 浏览器自动化 2.3 平台特定处理 3) 关键技术 4)代码亮点 5)总结 四、运行截图: 五、程序代码: 特别声明:***本代码仅限编程学…

674SJBH校园外卖订餐系统V3

1 绪论 近年来&#xff0c;随着Internet的迅速崛起&#xff0c;互联网已日益成为提供信息的最佳渠道并逐步进入传统的流通领域&#xff0c;传统的餐饮业在当前计算机网络信息化面前同样面临着一个新的挑战。民众的餐饮习惯也在渐渐的朝着“订餐到户&#xff0c;随时&#xff0…

海底捞为何用上了RFID

海底捞,作为中国餐饮业当之无愧的巨头,早已凭借其极致的服务体验和不断的创新精神深入人心。然而,在光鲜的服务背后,是其在数字化、智能化运营方面不懈的探索与投入。近年来,RFID技术悄然成为海底捞智慧餐厅体系中的关键一环。在众多技术选项中,海底捞为何独独青睐RFID?…