1、设置key值
2、创建一个共享内存,并且设定一个返回值为共享内存标识符。
3、建立起系统内存的映射,映射到数据段。这个数据段就是相当于要使用的字符串。 如果对内存进行写入,建议使用bzero先清空内存,然后使用strcpy读入就好。注意:我所学的写入没有解除数据段和删除共享内存
4、解除数据段
5、删除共享内存。
shm_read.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<unistd.h>
int main(){
//共享内存标识符
int shmid;
int ret;
key_t key;
char *shmadd;
/*建立一个key值*/
key = ftok(".",2012);
if(key == -1)
perror("key");
//查看系统共享内存
system("ipcs -m");
/*创建一个,key值;大小(字节为单位);控制的属性*/
shmid = shmget(key,BUFSZ,SHM_R|SHM_W);
if(shmid < 0){
perror("shmget");
exit(-1);
}
//共享内存的映射;NULL为地址,返回为共享内存段的首地址。
//我的理解为,从内存段映射到数据段,更容易进行读写操作。
//这个地址就相当于是所要使用的消息,在下文可以调用。
//0 为权限和条件,代表的意思是可读可写
shmadd = shmat(shmid,NULL,0);
if(shmadd < 0){
perror("shmat");
exit(-1);
}
printf("copy data from shared-memory\n");
printf("data = [%s]\n",shmadd);
//使用完之后要解除系统映射。解除的是映射地址。所以是映射的首地
址。
ret = shmdt(shmadd);
if(ret < 0){
perror("shmdt");
exit(1);
}
else
printf("deleted shared-memory\n");
//对共享内存进行控制。IPC_RMID是删除。
shmctl(shmid,IPC_RMID,NULL);
system("ipcs -m");
return 0;
}
shm_write.c
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<sys/types.h>
#define BUFSZ 2048
int main(){
int shmid;
int ret;
key_t key;
char *shmadd;
//return key number
key = ftok(".",2012);
if(key == -1)
perror("ftok");
// return shm number
shmid = shmget(key,BUFSZ,SHM_R|SHM_W|IPC_CREAT);
if(shmid < 0) {
perror("shmget");
exit(-1);
}
// she zhi shm
shmadd = shmat(shmid,NULL,0);
if(shmadd < 0){
perror("shmat");
_exit(-1);
}
printf("copy data to shared_memory \n");
//clear shm
bzero(shmadd,BUFSZ);
//give smh sonmthing
strcpy(shmadd,"data in shared memory\n");
return 0;
}