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 ...
随机推荐
- English Voice of <<Bye Bye Bye>>
Bye Bye Bye - Lovestoned When i see you, looking back at me 当我看到你回首看我时 Watching this eye still 彼此凝视 ...
- python+requests接口自动化测试框架实例详解教程
1.首先,我们先来理一下思路. 正常的接口测试流程是什么? 脑海里的反应是不是这样的: 确定测试接口的工具 —> 配置需要的接口参数 —> 进行测试 —> 检查测试结果(有的需要数据 ...
- 牛客寒假算法基础集训营6 I-wzoi
题目链接 分析:这个题本质上可以看成是一个括号匹配题,因为当出现00和11的时候,毫无疑问是前一天看题,后一天写题,这样可以得到最大的得分10 将全部00和11删掉后,就是交替出现的01串了 代码如下 ...
- 【Oracle】【3】字段自增长(+1)
业务场景——解决方案 1,每插入一条数据,其排序字段要增长1 —— Service层查询出最大值,再+1(参考博客的方法是触发器) 2,子表插入一条数据,主表某字段+1 —— where A.ID = ...
- MySQL5.6复制技术(1)-原理详解
SQL复制功能介绍 MySQL内建的复制功能是构建大型,高性能应用程序的基础.这类应用使用所谓的“水平扩展”的架构.我们可以通过为服务器配置一个或多个备库的方式来进行数据同步,将MySQL的数据分布到 ...
- CentOS是哪个版本 CentOS版本信息查看技巧
root@MyMail ~ # uname Linux root@MyMail ~ # uname -r 2.6.18-164.el5 [root@localhost ~]# uname -a Lin ...
- Java环境下shiro的测试-认证与授权
Java环境下shiro的测试 1.导入依赖的核心jar包 <dependency> <groupId>org.apache.shiro</groupId> < ...
- [codechef July Challenge 2017] IPC Trainers
IPCTRAIN: 训练营教练题目描述本次印度编程训练营(Indian Programming Camp,IPC)共请到了 N 名教练.训练营的日程安排有 M 天,每天最多上一节课.第 i 名教练在第 ...
- php composer 使用 以及 psr0和psr4的真正区别
composer 使用 项目和库之间唯一的区别是,你的项目是一个没有名字的包 包名不区分大小写,但惯例是使用小写字母,并用连字符作为单词的分隔 入门比较好资源: 官网适合读一遍 https://do ...
- js 求select option 的值和对应option的内容
<select onChange="aa(this)" name="a"> <option value="a">1& ...