当前位置: 首页 > article >正文

Linux 共享内存

在Linux中,共享内存是一种进程间通信的机制,可以使不同进程之间共享同一块物理内存区域。

以下是在Linux中使用共享内存的步骤:

写入共享内存:

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHMGET_SIZE 1024

int main(){
char str_buff[1024];
    //1、生成一个键值  ftok("文件名和路径", '低于八位的标识符');
    key_t ftok_key=ftok("./share", 'a');
    if (ftok_key == -1)
    {
        perror("ftok");
        exit(1);
    }
    //2、创建共享内存 
    int shmage_id=shmget(ftok_key, SHMGET_SIZE, IPC_CREAT|0666);
    if (shmage_id == -1)
    {
          perror("shmget");
          exit(1);
    }
    //3、映射共享内存
    char *shmat_add=(char *)shmat(shmage_id, NULL, 0);
    if (shmat_add == (char *)(-1))
    {
          perror("shmat");
          exit(1);
    }
    //4、写入共享内容
    while (1)
    {
        fgets(str_buff, sizeof(str_buff), stdin);
        strcpy(shmat_add, str_buff);
        if (strncmp(shmat_add, "quit", 4) == 0)
        {
            printf("正在退出......\n");
            sleep(1);
            break;
        }
   
    
    }
    

return 0;
}

读内存

#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define SHMGET_SIZE 1024

int main(){
char str_buff[1024];
    //1、生成一个键值
    key_t ftok_key=ftok("./share", 'a');
    if (ftok_key == -1)
    {
        perror("ftok");
        exit(1);
    }
    //2、创建共享内存
    int shmage_id=shmget(ftok_key, SHMGET_SIZE, IPC_CREAT|0666);
    if (shmage_id == -1)
    {
          perror("shmget");
          exit(1);
    }
    //3、映射共享内存
    char *shmat_add=(char *)shmat(shmage_id, NULL, SHM_RDONLY);
    if (shmat_add == (char *)(-1))
    {
          perror("shmat");
          exit(1);
    }
    //4、读共享内容
    //这里做了优化 一般读内存 会一直去读  但是一直去读 可能会重复读取很多一样的内容
    //使用strncmp去做比较 不同的时候才去拷贝内存的值
    while (1)
    {
               //优化过的
           if (strncmp(shmat_add, str_buff, 10) != 0) {
            strcpy(str_buff, shmat_add); // 更新 str_buff
            printf("%s", str_buff);
            sleep(1);
        }
        if (strncmp(shmat_add, "quit", 4) == 0)
        {
            printf("正在退出......\n");
            sleep(1);
            break;
        }
        }
        //5、不用了就分离接触
        if (shmdt(shmat_add) == -1)
        {
            perror("shmdt");
            return 1;
        }
return 0;
}


http://www.kler.cn/a/389332.html

相关文章:

  • RV1126+FFMPEG推流项目源码
  • 1. 基于图像的三维重建
  • 深圳大学-计算机系统(3)-实验三取指和指令译码设计
  • 游戏设备升级怎么选?RTX4070独显,ToDesk云电脑更具性价比
  • 【2024 博客之星评选】请继续保持Passion
  • 【Linux】环境变量
  • 戴尔R930服务器增加 Intel X710-DA2双万兆光口含模块
  • 服务器被病毒入侵如何彻底清除?
  • Intern大模型训练营(四):使用Hugging Face下载模型
  • RoseTTAFold PositionalEncoding类解读
  • (C++11)委托构造函数--C++
  • 如何在Oracle应用中使用BI PUBLISHER API将RTF转换为XSL-FO
  • XGBoost算法Python代码实现
  • Iceberg 写入和更新模式,COW,MOR(Copy-on-Write,Merge-on-Read)
  • sqli-labs(第二关)
  • ThinkBook 14+ 2024 Ubuntu 触控板失效 驱动缺失问题解决
  • 腾讯自研的 Git 客户端!!【送源码】
  • vue3中使用输入框按回车键刷新页面问题
  • 零拷贝Zero Copy
  • RabbitMQ的应用
  • 【STK学习】part1-卫星轨道与Walker星座基础知识
  • 《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)
  • 信息泄露漏洞一文速通
  • Facebook vs. Google:哪个更适合你的品牌
  • rabbitMq怎么保证消息不丢失?消费者没有接收到消息怎么处理
  • MySQL_聚合函数分组查询