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

news2025/6/1 11:42:42

共享内存使用

//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.coloradmin.cn/o/2392952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何优化微信小程序中渲染带有图片的列表(二进制流存储方式的图片存在本地数据库)

方法一&#xff1a;对列表的获取进行分页处理 实现方法&#xff1a; 前端请求&#xff08;需要向后端传两个参数&#xff0c;pageIndex是获取第几页是从0开始&#xff0c;pageSize是这一页需要获取多少个数据&#xff09; 后端接口实现&#xff08;因为这里是通过参数拼接请求…

尝鲜纯血鸿蒙,华为国际版本暂时不支持升级。如mateX6 国际版?为什么不支持?什么时候支持?

一&#xff1a;mateX6 国际版支持鸿蒙吗&#xff1f; 不支持 二&#xff1a;华为国际版支持鸿蒙吗&#xff1f; 不支持 三&#xff1a;华为国际版什么时候支持&#xff1f; 2025年预期可以支持。请耐心等待。 三&#xff1a;国际版为什么不支持&#xff1f; EMUI 采用AO…

[科研实践] VS Code (Copilot) + Overleaf (使用 Overleaf Workshop 插件)

科研圈写文档常用 Latex 环境&#xff0c;尤其是 Overleaf 它自带的 AI 润色工具 Writefull 太难用了。如果能用本地的 CoPilot / Cursor 结合 Overleaf&#xff0c;那肯定超高效&#xff01; 于是我们找到了 VS Code 里的 Overleaf Workshop 插件。这里已经安装好了&#xff0…

从0开始学习R语言--Day12--泊松分布

今天我们来看一个很经典的回归模型&#xff1a;泊松分布。 泊松分布 我们一般会把泊松分布用于预测问题&#xff0c;比如想知道成年人每天接到的骚扰电话次数&#xff0c;医院每天的急诊病人等。但在一些方面&#xff0c;跟我们想的会有出入。例如你不能将其应用在预测下周你的…

工控机安装lubuntu系统

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

视频监控汇聚平台EasyCVR安防小知识:如何通过视频融合平台解决信息孤岛问题?

一、项目背景与需求分析​ 随着数字化技术发展与网络带宽升级&#xff0c;视频技术应用场景不断拓展&#xff0c;视频监控、记录仪等多样化产品构建起庞大体系。但这些独立系统彼此割裂&#xff0c;形成信息孤岛。 在系统集成项目中&#xff0c;视频系统深度融合已成必然趋势…

在大型中实施访问控制 语言模型

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

Haption在危险、挑战性或受限环境中操作的情况提供了一种创新的遥操作解决方案

Haption Virtuose 6D TAO是一款拥有7个主动自由度的触觉设备&#xff0c;专为虚拟现实环境交互而设计。 它与Virtuose的一系列软件解决方案兼容&#xff0c;可让您直接在CAD软件中使用该设备进行装配仿真&#xff0c;并在3D游戏引擎中使用该设备&#xff0c;从而打造更加逼真的…

行为型:状态模式

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

优雅草最新实战项目技术Discuz X3.5电子签约插件开发项目实施方案优雅草·卓伊凡

优雅草最新实战项目技术Discuz X3.5电子签约插件开发项目实施方案优雅草卓伊凡 一、项目概述 甲方需求&#xff1a;为现有Discuz X3.5系统集成电子签约功能&#xff0c;对接e签宝API&#xff0c;实现用户发起/签署合同、模板管理、签约记录查询等功能。 总预算&#xff1a;9,3…

基于本地化大模型的智能编程助手全栈实践:从模型部署到IDE深度集成学习心得

近年来&#xff0c;随着ChatGPT、Copilot等AI编程工具的爆发式增长&#xff0c;开发者生产力获得了前所未有的提升。然而&#xff0c;云服务的延迟、隐私顾虑及API调用成本促使我探索一种更自主可控的方案&#xff1a;基于开源大模型构建本地化智能编程助手。本文将分享我构建本…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.8 R语言解题

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

引领机器人交互未来!MANUS数据手套解锁精准手部追踪

MANUS数据手套为机器人技术带来高精度手部追踪&#xff0c;助力实现人与机器的自然交互&#xff01;近年&#xff0c;越来越多客户希望利用这项技术精准操控机械臂、灵巧手和人形机器人&#xff0c;不断提升设备的智能化水平和交互体验。 MANUS数据手套是高精度人机交互设备&am…

源的企业级网络安全检测工具Prism X(棱镜X)

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

基于FPGA的二叉决策树cart算法verilog实现,训练环节采用MATLAB仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) MATLAB训练结果 上述决策树判决条件&#xff1a; 分类的决策树1 if x21<17191.5 then node 2 elseif x21>17191…

权限分配不合理如何影响企业运营?

“我们明明只给了她CRM的查看权限&#xff0c;怎么客户数据被删了&#xff1f;” “新员工入职三天了&#xff0c;HR系统权限还没开通&#xff0c;流程完全卡住&#xff01;” “上个月刚给项目经理配了财务权限&#xff0c;怎么又出乱子了&#xff1f;” 这些对话是否在你的…

ES分词搜索

ES的使用 前言作者使用的版本作者需求 简介ES简略介绍ik分词器简介 使用es的直接简单使用es的查询 es在java中使用备注说明 前言 作者使用的版本 es: 7.17.27spring-boot-starter-data-elasticsearch: 7.14.2 作者需求 作者接到一个业务需求&#xff0c;我们系统有份数据被…

【数据库】并发控制

并发控制 在数据库系统&#xff0c;经常需要多个用户同时使用。同一时间并发的事务可达数百个&#xff0c;这就是并发引入的必要性。 常见的并发系统有三种&#xff1a; 串行事务执行&#xff08;X&#xff09;&#xff0c;每个时刻只有一个事务运行&#xff0c;不能充分利用…

Ansys Zemax | 手机镜头设计 - 第 2 部分:光机械封装

本文该系列文章将讨论智能手机镜头模组设计的挑战&#xff0c;涵盖了从概念、设计到制造和结构变形的分析。本文是四部分系列的第二部分&#xff0c;介绍了在 Ansys Speos 环境中编辑光学元件以及在整合机械组件后分析系统。案例研究对象是一家全球运营制造商的智能手机镜头系统…

mcp-go v0.30.0重磅发布!Server端流式HTTP传输、OAuth支持及多项功能革新全面解读!

随着云原生应用和现代分布式系统需求的不断增长&#xff0c;高效、灵活且稳定的通信协议和客户端交互框架成为开发者关注的焦点。作为开源领域备受期待的项目之一&#xff0c;mcp-go再次迎来重要版本更新——v0.30.0正式发布&#xff01;本次更新版本不仅实现了众多关键功能&am…