system的共享内存实例
system的共享内存指的是内核指定一块内存区域映射到虚拟地址空间供进程通信使用的机制
1\创建或打开共享内存块
函数原型
int shmget(key_t key, size_t size, int shmflg)
参数
参数1:一个key_t类型的变量.IPC_PRIVATE或者>0的值
参数2:要创建共享内存的大小,取值为页面大小的整数倍
参数3:取IPC_CREAT或者IPC_EXCL
返回值
返回一个共享内存块的标识符
2\使用共享内存块
函数原型
void *shmat(int shmid, const void *shmaddr, int shmflg)
参数
参数1:shmget返回的共享内存块标识符
参数2:指定共享内存的虚拟地址位置,可取NULL,表示由内核管理
参数3:SHM_RND
返回值
返回进程虚拟地址空间内的一个地址,失败-1
实验代码
/* 向共享内存地址空间写入数据shm_write.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <errno.h> #define KEY_NAME "/tmp/mkfifo.0001" int main(int argc, char *argv[])
{
int myshmid;
void *shmaddr; /* 创建成功的虚拟内存地址 */
key_t key = ftok(KEY_NAME, 0x1235); /* 创建一个key */
if(key == -1)
{
printf("ftok key failed, app exit! error : %s\n", strerror(errno));
exit(-1);
}
printf("ftok succeed, key : %d\n", key); myshmid = shmget(key, 1024, IPC_CREAT|IPC_EXCL|0666); /* 创建共享内存 */
if(myshmid == -1)
{
printf("shmget failed, app exit! error : %s\n", strerror(errno));
exit(-1);
}
printf("shmget succeed, shmid : %d\n", myshmid); shmaddr = shmat(myshmid, NULL, SHM_RND); /* 由内核指定一块地址空间 */
if(shmaddr == (void *)-1)
{
printf("shmat failed, app exit! error : %s\n", strerror(errno));
exit(-1);
}
printf("shmat succeed, share memory address : 0x%x\n", shmaddr); char shmdata[50] = "This is a SYSTEM V share memory test!";
strncpy(shmaddr, shmdata, sizeof(shmdata));
printf("write data into address : 0x%x succeed!\n", shmaddr); return 0;
}
/* 向共享内存地址空间读取数据shm_read.c */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <errno.h> #define KEY_NAME "/tmp/mkfifo.0001" int main(int argc, char *argv[])
{
int myshmid;
key_t key = ftok(KEY_NAME, 0x1235); /* 创建一个key */
if(key == -1)
{
printf("ftok key failed, app exit! error : %s\n", strerror(errno));
exit(-1);
}
printf("ftok succeed, key : %d\n", key); myshmid = shmget(key, 1024, IPC_EXCL|0666); /* 获取shmid */
if(myshmid == -1)
{
printf("get shmid failed, app exit! error : %s\n", strerror(errno));
exit(-1);
}
printf("shmget succeed, shmid : %d\n", myshmid); void *rdaddr = shmat(myshmid, NULL, 0);
printf("read data from shmid : %d, data : %s\n", myshmid, rdaddr); shmdt(shmaddr); /* 将共享内存的虚拟地址空间与进程空间进行分离 */
printf("shdt succeed!\n"); int result = shmctl(myshmid, IPC_RMID, (struct shmid_ds *)NULL); /* 删除共享内存 */
if(result == -1)
{
printf("delete share memory failed, app exit. error : %s!\n", strerror(errno));
exit(-1);
}
printf("delete share memory succeed!\n");
return 0;
}
实验结果
运行之前系统的共享内存使用情况

创建共享内存并写入数据

读取数据并删除共享内存

ps:创建共享内存的系统限制
SHMMNI:系统所能够创建共享内存的最大个数 cat /proc/sys/kernel/shmmni
SHMMIN:一个共享内存段的最小字节数
SHMMAX:一个共享内存段的最大字节数 cat /proc/sys/kernel/shmmax
SHMALL:系统中共享内存的分页总数 cat /proc/sys/kernel/shmall
SHMSEG:一个进程允许attach的共享内存段的最大个数
system的共享内存实例的更多相关文章
- C#共享内存实例 附源码
原文 C#共享内存实例 附源码 网上有C#共享内存类,不过功能太简单了,并且写内存每次都从开头写.故对此进行了改进,并做了个小例子,供需要的人参考. 主要改进点: 通过利用共享内存的一部分空间(以下称 ...
- System V共享内存介绍
(一)简单概念 共享内存作为一种进程间通信的方式,其相较于其他进程间通信方式而言最大的优点就是数据传输速率快.其内部实现的方式采用了Linux进程地址空间中的mmap文件映射区,将文件内容直接映射到各 ...
- Linux进程通信之System V共享内存
前面已经介绍过了POSIX共享内存区,System V共享内存区在概念上类似POSIX共享内存区,POSIX共享内存区的使用是调用shm_open创建共享内存区后调用mmap进行内存区的映射,而Sys ...
- 阐述linux IPC(五岁以下儿童):system V共享内存
[版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途] system V共享内存和posix ...
- UNIX环境高级编程——System V 共享内存区
共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...
- Linux IPC实践(9) --System V共享内存
共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...
- php进程(线程)通信基础--System V共享内存
PHP默认情况没有开启功能,要支持该功能在编译PHP的时候要加入下面几个选项 System V消息,--enable-sysvmsg System V信号量支持,--enable-sysvsem ...
- System V 共享内存区
1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文 ...
- 共享内存之——system V共享内存
System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...
随机推荐
- Android Error:Could not find lottie.jar
Android Error:Could not find lottie.jar 今天遇到了一个及其头疼的问题 同事的工程导到我的电脑里却报错,错误是找不到jcenter仓库里的lottie.jar包 ...
- apiClould微信三方登录,qq三方登录
三方登录需要在config.xml文件中配置一下,res文件下需要新建一个key.xml文件中也需要配置,请点击链接查看详情 微信:https://docs.apicloud.com/Client-A ...
- Weighted Channel Dropout for Regularization of Deep Convolutional Neural Network
这是AAAI2019的一篇论文,主要是为了解决小数据集的过拟合问题,使用了针对于卷积层的Dropout的方法. 论文的要点记录于下: 1.在训练过程中对于卷积层的channels进行droipout, ...
- 微信小程序地图demo完整
<block wx:for="{{data_2}}" wx:key='index' wx:if="{{data_2.length}}"> <v ...
- hihocoder 1513 小Hi的烦恼 (bitset优化)
大意: n个人, 5门课, 给定每个人每门课的排名, 对于每个人输出有多少人5门课都比他差. 明显是个5维偏序问题, 题目有保证排名均不同, 可以用bitset优化为$O(\frac{n^2}{\om ...
- MVC实战之排球计分(一)—— 需求分析与数据库设计
此系列博客目的是制作一款排球计分程序.这系列博客讲讲述此软件的 各个功能的设计与实现. 一.需求分析: 这个程序是排球计分程序,其业务非常简单,具体如下: 1.本程序可以选择用户身份,通过不同角度记录 ...
- 二、工作中常用的SQL优化
除了给table建立索引之外,保持良好的SQL语句编写. 1.通过变量的方式来设置参数 比如动态查询的时候,尽量这样写 好:string strSql=" SELECT * FROM PEO ...
- C++LeetCode:: Container With Most Water
本来写的题目不是这个,而是字符串匹配,考虑了很多情况写了很久最后看了solution,发现可以用动态规划做.感觉被打击到了,果断先放着重新写一个题,后面心情好了再重新写吧,难过.每天都要被LeetCo ...
- 更改pip源至国内镜像
更改pip源至国内镜像 经常在使用Python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样 ...
- 把旧系统迁移到.Net Core 2.0 日记(8) - EASYUI datagrid+ Dapper+ 导出Excel
迁移也没太大变化,有一个, 之前的Request.QueryString 是返回NameValueCollection, 现在则是返回整个字符串. 你要改成Request.Query[“key”] 直 ...