共享内存例子|学习笔记

简介: 快速学习共享内存例子,写一个程序,创建并打开一个共享内存块,再写一个程序,打开共享内存块并使用。

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频共享内存例子】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/11056


共享内存例子

 

内容介绍:

一、例: 02_shared_memory_read.c

二、例: 02_shared_memory_write.c

三、注意

 

一、例: 02_shared_memory_read.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#define BUFSZ 2048

int main (int argc, char *argv [])

{

int shmid ;  //定义几个变量

int ret;

key_t key;

char *shmadd ;

key = ftok (" . ",2012);  

 //通过 ftok 当前目录2012得到一个 key值

if(key==-1)

{

perror( "ftok") ;

return 0;

}

system ( "ipcs -m") ;  

//查看共享内存信息

/*打开共享内存*/

shmid = shmget (key,BUFSZ,IPC_CREAT|0666) ;  

//通过 key 值创建并打开或者打开一个已经存在的共享内存块,如//果不存在则创建0666,得到一个共享内存的id

if(shmid < 0)

{

perror ( "shmget" ) ;

exit (-1);

}

/*映射*/

shmadd = shmat (shmid,NULL, 0) ;

//由系统分配地址,并且可读可写

if (shmadd < o)

{

perror ( "" shmat"") ;

exit(-1);

}

/*读共享内存区数据*/

printf ("daFa =[ %s ] \n" , shmadd) ;

//通过指针读取并打印共享内存块中的内容

/*分离共享内存和当前进程*/

ret = shmdt (shmadd) ;//判断分离是否成功

if (ret < 0)

{

perror ( "shmdt" ) ;

exit(1);

}

else

{

printf ( "分离shared-memory\n") ;

}

/*删除共享内存*/

shmctl (shmid,IPC_RMID,NULL) ;

system ( "ipcs -m" ) ;

return 0 ;

}

 

二、例: 02_shared_memory_write.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <unistd.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#define BUFSZ 2048

{

int shmid ;

int ret;

key_t key;

char *shmadd ;

key = rtok ( " . ",2012);

//通过 ftok 当前目录2012得到一个 key 值

if (key ==-1 )

{

perror(""ftok" ) ;

return 0;

}

/*创建共享内存*/

shmid = shmget(key,BUFSZ,IPC_CREAT I0666);

//创建并打开一个新的共享内存块或者打开一个已经存在的共享内//存块

if(shmicd < 0)

{

perror ( "shmget") ;

exit(-1);

}

/*映射*/

shmadd = shimat (shrnid,NULL,0);

// shmadd 指针指向系统分配的内存

if(shmadd < 0)

{

perror ( " shmat" );

exit (-1) ;

}

*拷贝数据至共享内存区*/

printf( "copy data to shared-memory\n") ;

bzero(shmadd,BUFSZ) ;//将指针指向的内存变为0

strcpy (shmadd , "data in shared memory") ;

//将该字符串写入

return 0 ;

}

 

三、注意

SIM_LOCK 用于锁定内存,禁止内存交换。并不代表共享内存被锁定后禁止其它进程访问。其真正的意义是:被锁定的内存不允许被交换到虚拟内存中。

这样做的优势在于让共享内存一直处于内存中,从而提高程序性能。

相关文章
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
282 0
|
存储 编译器 C语言
【C++】学习笔记——内存管理
【C++】学习笔记——内存管理
153 15
|
存储 缓存 Linux
计算机操作系统学习笔记(5)——内存管理
计算机操作系统学习笔记(5)——内存管理
212 0
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
179 0
|
存储 C++
C primer plus 学习笔记 第12章 存储类别、链接和内存管理
C primer plus 学习笔记 第12章 存储类别、链接和内存管理
136 2
|
存储 缓存 算法
十五、Linux性能优化实战学习笔记 - Linux内存是怎么工作的
内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等
501 1
|
NoSQL Redis
Redis学习笔记-内存碎片对性能的影响
Redis学习笔记-内存碎片对性能的影响
232 0
|
存储 并行计算 测试技术
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
347 0
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
java202302java学习笔记第十天-数组的内存图1
java202302java学习笔记第十天-数组的内存图1
198 0
java202302java学习笔记第十天-数组的内存图1
java202302java学习笔记第六天-创建内存对象分析
java202302java学习笔记第六天-创建内存对象分析
217 0
java202302java学习笔记第六天-创建内存对象分析

热门文章

最新文章