首页 > IPC--共享内存

IPC--共享内存

有了之前的学习经验,共享内存对我们学习起来相对简单一些了,这里简单说说共享内存的一些,然后对于函数的分析直接在代码里面的注释部分有说明,如果还是不懂,可以先看看前面的关于IPC–信号量还有IPC–消息队列的讲解

共享内存以传递数据为目的,速度最快,不需要数据在内存还物理内存的来回的拷贝,直接访问访问虚拟地址空间

共享内存没有同步与互斥机制,这个时候我们可以结合着IPC–信号量进行进程间通信

下面我们直接粘贴代码

client.c

#include"comm.h"int main()
{int shmid = getShm(0);int i = 0;char* arr = (char*)shmat(shmid,NULL,0);while(1){sleep(1);printf("%s
",arr);i++;if(i==25)break;}int dt =  shmdt(arr);if(dt < 0){perror("shmdt
");return -1;}return 0;
}

comm.c

#include"comm.h"static int commShm(int size,int flag)   //size:共享内存的大小,flag:进行何种操作,是获取还是创建
{key_t key = ftok(PATHNAME,ID);if(key < 0){perror("key_t
");return -1;}int shmid = shmget(key,size,flag);  //key:键值,size:大小,这里传入的大小最好是4k(4096)的倍数//因为4096是一页,如果我们传递的是4097,系统会自动的对齐到8192,//但是因为我们申请的是4097,剩下的内存系统不会给你,flag:创建方式if(shmid < 0){perror("shmget
");return -2;}return shmid;
}int creatShm(int size) //size:创建内存空间的大小
{return commShm(size,IPC_CREAT|IPC_EXCL|0666);
}int getShm(int size)
{return commShm(size,IPC_CREAT);   //size:默认设置为0
}int desShm(int shmid)
{int des = shmctl(shmid,IPC_RMID,NULL);    //shmid:删除的是哪一个共享内存,IPC_RMID:控制方式,这里是删除的意思//NULL:这里是struct shmid_ds *buf,这是一个维护共享 内存的一个结构体//暂时不关心if(des < 0){perror("shmctl
");return -1;}return des;
}

comm.h

#ifndef _COMM_H_
#define _COMM_H_#include
#include
#include#define PATHNAME "."
#define ID 0x6666int creatShm(int size);
int getShm(int size);
int desShm(int shmid);#endif

server.c

#include"comm.h"int main()
{int i = 0;int shmid = creatShm(27);char* arr = (char*)shmat(shmid,NULL,0);   //这里可以把shmat当成是malloc使用,shmid:信号量标识符//NULL:const void* shmaddr,虚拟地址空间,设置为NULL,这个是系统自己定义的//返回值void* 这个时候我们要强制转换成我们需要的类型for(;i<26;){sleep(1);arr[i] = 'A' + i;   //这里可以直接当成是malloc开辟的一个数组使用i++;arr[i] = 0;}int dt =  shmdt(arr);   //arr:这个就是我们上面的那个内存空间地址if(dt < 0){perror("shmdt
");return -1;}desShm(shmid);return 0;
}

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • 1. 定义网络的基本参数 定义输入网络的是什么: input = Input(shape=(240, 640, 3)) 反向传播时梯度下降算法 SGD一定会收敛,但是速度慢 Adam速度快但是可能不收敛 [link](https://blog.csdn.net/wydbyxr/article/details/84822806...

  • size_t和int       size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。 在32位架构中被普遍定义为: typedef   unsigned int size_t; 而在64位架构中被定义为: typedef  unsigned lo...

  • 我在 https://blog.csdn.net/wowricky/article/details/83218126 介绍了一种内存池,它的实现类似于linux 中打开slub_debug (1. make menuconfig: Kenel hacking -> Memory Debugging, 2. comand line中传入...

  • 项目开发中需要从引擎 获取一定范围的数据大小,用作打点上报,测试过程中竟然发现写入了一部分数据之后通过GetApproximateSizes 获取写入的key的范围时取出来的数据大小竟然为0。。。难道发现了一个bug?(欣喜) 因为写入的数据是小于一个sst的data-block(默认是4K),会不会因为GetApproximate...