命令

  • ipcs 命令查看共享内存、消息队列、管道等相关信息
  • ipcs -m 查看共享内存的信息

代码

  • 创建共享内存
  • 共享内存 关联 进程
  • 分离共享内存
  • 删除共享内存
#include <sys/shm.h>
#include <iostream>#define BUF_SIZE 1024int main() {int share_id = 0;//创建共享内存if ((share_id = shmget(IPC_PRIVATE,BUF_SIZE,0666))<0){//IPC_PRIVATE 系统分配管理,其key以0x00000000标识perror("shmget error!");exit(1);} else{printf("created shared-memory:%d\n",share_id);system("ipcs -m");}//共享内存 关联 逻辑指针void *share_add;if((share_add = shmat(share_id,0,0)) < (void *)0){perror("shmat error!");exit(1);}else{printf("attached shared-memory!\n");system("ipcs -m");}//分离共享内存if((shmdt(share_add))<0){perror("shmdt error!");exit(1);}else{printf("separate shared-memory!\n");system("ipcs -m");}//删除共享内存if ((shmctl(share_id,IPC_RMID,0))<0){perror("shmctl error!");exit(1);}else{printf("release shared-memory!\n");system("ipcs -m");}return 0;
}

代码

  • 服务器产生数据,客户端输出数据,服务器和客户端使用相同的共享内存

服务器

#include <sys/shm.h>
#include <iostream>
#include <unistd.h>#define BUF_SIZE 1024struct sys_data{float data_rh;float data_t;
};
int main(int argc,char* argv[]) {int share_id = 0;struct sys_data *struct_data{};//创建共享内存share_id = shmget((key_t)45958023,sizeof (sys_data),0666|IPC_CREAT);if (share_id == -1){perror("shmget error!");exit(-1);}else{printf("created shared-memory:%d\n",share_id);}//共享内存 关联 逻辑指针void *share_add;share_add = shmat(share_id,0,0);if (share_id == -1){perror("shmat error!");exit(-1);}float f_temp{};float f_humi{};struct_data = reinterpret_cast<struct sys_data *>(share_add);while (1){f_temp = rand() % 100;f_humi = rand() % 100;struct_data->data_rh = f_humi;struct_data->data_t = f_temp;sleep(1);}
//    //分离共享内存
//    if((shmdt(share_add))<0){
//        perror("shmdt error!");
//        exit(1);
//    }
//    //删除共享内存
//    if ((shmctl(share_id,IPC_RMID,0))<0){
//        perror("shmctl error!");
//        exit(1);
//    }else{
//        printf("release shared-memory!\n");
//        system("ipcs -m");
//    }return 0;
}

客户端

#include <sys/shm.h>
#include <iostream>
#include <unistd.h>#define BUF_SIZE 1024struct sys_data{float data_rh;float data_t;
};
int main(int argc,char* argv[]) {int share_id = 0;struct sys_data *struct_data{};//创建共享内存share_id = shmget((key_t)45958023,sizeof (sys_data),0666|IPC_CREAT);if (share_id == -1){perror("shmget error!");exit(-1);}else{printf("created shared-memory:%d\n",share_id);}//共享内存 关联 逻辑指针void *share_add;share_add = shmat(share_id,0,0);if (share_id == -1){perror("shmat error!");exit(-1);}float f_temp{};float f_humi{};struct_data = reinterpret_cast<struct sys_data *>(share_add);while (1){sleep(2);printf("temp = %.lf,humi = %.lf\n",struct_data->data_t,struct_data->data_rh);}
//    //分离共享内存
//    if((shmdt(share_add))<0){
//        perror("shmdt error!");
//        exit(1);
//    }
//    //删除共享内存
//    if ((shmctl(share_id,IPC_RMID,0))<0){
//        perror("shmctl error!");
//        exit(1);
//    }else{
//        printf("release shared-memory!\n");
//        system("ipcs -m");
//    }return 0;
}

参考链接

  • 共享内存函数(shmget、shmat、shmdt、shmctl)及其范例

进程之间通信 共享内存相关推荐

  1. 进程间的通信——共享内存

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...

  2. Linux下进程通信---共享内存之:shm

    进程通信:进程与进程间的数据交换,称为进程通信.进程通讯的方式有:共享内存.信号量.管道.消息队列.socket等等. 共享内存:内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内 ...

  3. 【操作系统实验】Linux进程通信—共享内存通信、管道通信

    Linux进程通信-共享内存通信.管道通信 一.实验目的: 二.实验题目: 1. 试设计程序利用共享内存完成如下进程通信 1.shmget函数 2.shmat函数 3.shmdt函数 4.shmctl ...

  4. 【进程】进程通信-共享内存

    共享内存 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区.在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一 个共享内存区的最大字节数shmmax,系统范围内最 ...

  5. ZUCC_操作系统实验_Lab7进程通信---共享内存

    lab7进程通信-共享内存 一.利用共享内存实现生产者/消费者问题的解决方案 1.代码 #include<stdio.h> #include<stdlib.h> #includ ...

  6. c语言共享内存,在爷儿俩进程间使用共享内存(共享内容含指针)

    在父子进程间使用共享内存(共享内容含指针) 比如有这样一个结构体 #define MAX_QUE_LEN 100 //定义数据包缓存队列 typedef struct _t_pkt_queue { U ...

  7. 线程与进程之间的共享资源

    线程和进程之间的共享资源方式 进程之间的共享资源的方式 1.消息队列 2.共享内存 3.管道(有名管道.无名管道) 4.信号 5.套接字 同一个进程的不同线程之间可以共享的资源 1.堆,由于堆是在进程 ...

  8. WIN32 进程间通讯-共享内存

    一.引言     在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换 ...

  9. python进程的注意点(进程之间不共享全局变量、主进程会等待所有的子进程执行结束再结束)

    1. 进程的注意点介绍 进程之间不共享全局变量 主进程会等待所有的子进程执行结束再结束 2. 进程之间不共享全局变量 import multiprocessing import time# 定义全局变 ...

最新文章

  1. [JAVA EE] Thymeleaf 常用工具类
  2. 组织级项目管理实例分享——来自项目管理群的讨论
  3. 如何用c 语言编写阶乘程序,求10000的阶乘(c语言代码实现)
  4. jQuery选择器种类整理
  5. android 输入法如何启动流程_android输入法02:openwnn源码解析01—输入流程
  6. Java NIO零拷贝
  7. 有感于Oracle 9i的QueryHints
  8. 利用SQL SERVER 2008 的XML字段类型实现扩展属性
  9. asp程序ajax怎么写,ASP+AJAX+ACCESS数据库实例讲解三个步骤分享
  10. vue前端跨域解决方案
  11. 怎么注册tk域名_.TK后缀顶级域名的免费注册图文教程
  12. 论文笔记 | code representation(代码表示学习)系列
  13. 注解和注解处理器APT
  14. Get a Model! Model Hijacking Attack Against Machine Learning Models
  15. HTML5之10 __使用 Canvas API创建 热点图
  16. MySQL基础——(MySQL概述及SQL通用语法)
  17. 教你如何注册winrar~
  18. 最难得的素养,是等人把话说完
  19. C语言整数转字符串-递归算法
  20. Unity_Shader中级篇_10_Unity Shader入门精要

热门文章

  1. 山西计算机网络技术专升本分数线_2020山西成考专升本招生补录第一批公告!附补录院校专业缺额表!...
  2. ASP.NET MVC 入门10、Action Filter 与 内置的Filter实现(实例-防盗链)
  3. 敏捷项目管理过程改进
  4. Windows Workflow Foundation(WWF)介绍
  5. 一步步编写操作系统 1 部署工作环境 1
  6. html中点击照片时放大缩小,基于jquery实现一张图片点击鼠标放大再点缩小
  7. gperftools mysql_利用 gperftools 对nginx mysql 内存管理 性能优化
  8. mysql动静分离_haproxy的web服务负载均衡、动静分离、 MySQL服务负载均衡、状态监控...
  9. CURLE_WRITE_ERROR
  10. 百度顶会论文复现(1):课程概述