开发者学堂课程【物联网开发- 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 用于锁定内存,禁止内存交换。并不代表共享内存被锁定后禁止其它进程访问。其真正的意义是:被锁定的内存不允许被交换到虚拟内存中。
这样做的优势在于让共享内存一直处于内存中,从而提高程序性能。