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 ...
随机推荐
- LeetCode--496--下一个更大元素I(java)
给定两个没有重复元素的数组 nums1和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更大 ...
- 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器
这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...
- 赵炯博士《Linux内核完全注释》
赵炯:男,1963年10月5日出生,江苏苏州人,汉族. 同济大学机械工程学院机械电子教研室副教授,从事教学和科研工作. 现在主要为硕士和博士研究生开设<计算机通信技术>.<计算机控制 ...
- Weighted Channel Dropout for Regularization of Deep Convolutional Neural Network
这是AAAI2019的一篇论文,主要是为了解决小数据集的过拟合问题,使用了针对于卷积层的Dropout的方法. 论文的要点记录于下: 1.在训练过程中对于卷积层的channels进行droipout, ...
- 20165309 实验三 敏捷开发与XP实践
2017-2018-2 20165309实验三<Java面向对象程序设计>实验报告 一.实验内容 1. XP基础 2. XP核心实践 3. 相关工具 二.实验步骤 (一)代码规范 1.在I ...
- function_exists
在已经定义的函数列表(包括系统自带的函数和用户自定义的函数)中查找 function_name. 如果 function_name 存在且的确是一个函数就返回 TRUE ,反之则返回 FALSE .
- MAC常用软件工具(随某人个人版)
1.mac命令行工具(自带升级版) https://ohmyz.sh/ 连接远程服务器地址: 直接输入 ssh -A -p 22 root@IP 如:ssh -A -p 22 root@www.bai ...
- js如何将选中图片文件转换成Base64字符串?
如何将input type="file"选中的文件转换成Base64的字符串呢? 1.首先了解一下为什么要把图片文件转换成Base64的字符串 在常规的web开发过程中,大部分上传 ...
- js--事件冒泡-捕获
什么是事件流: 事件流描述的是从页面中接受事件的顺序,但有意思的是,微软(IE)和网景(Netscape)开发团队居然提出了两个截然相反的事件流概念, IE的事件流是事件冒泡流(event bubbl ...
- lda topic number
Hi Vikas -- the optimum number of topics (K in LDA) is dependent on a at least two factors: Firstly, ...