本博客由个人学习撰写,如有不对的火改进的地方请留言!!
写共享内存实例:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
char name[20];
int arg;
}MAN;
int main()
{
int shm_id;
int i;
MAN *p_map = NULL;
//创建key
key_t key = ftok("./shm",0);
if(key==-1)
{
perror("ftok error");
exit(0);
}
else
{
printf("key=%d\n",(int)key);
}
shm_id = shmget(key,4096,IPC_CREAT);//一内存页
if(shm_id==-1)
{
perror("shmget error");
exit(0);
}
else
{
printf("shm_id=%d\n",shm_id);
}
//第二个参数为NULL表示系统自选内存
p_map = (MAN*)shmat(shm_id,NULL,0);//将内存映射到进程中来
if((void*)p_map == (void*)-1)
{
perror("shmat error");
exit(0);
}
char temp='a';
for(i = 0;i<10;i++)
{
temp++;
memcpy((p_map+i)->name,&temp,1);
(p_map+i)->arg = 10+i;
}
if(shmdt(p_map) == -1)
{
perror("detach error");
}
return 0;
}
读共享内存实例:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
typedef struct
{
char name[20];
int age;
}MAN;
int main()
{
int shm_id;
int i;
MAN*p_map = NULL;
key_t key = ftok("./shm",0);
if(key == -1)
{
perror("ftok error");
exit(0);
}
else
{
printf("key=%d\n",key);
}
shm_id = shmget(key,4096,IPC_CREAT);
if(shm_id == -1)
{
perror("shmget error");
exit(0);
}
else
{
printf("shm_id=%d\n",shm_id);
}
p_map = (MAN*)shmat(shm_id,NULL,0);
if((void*)p_map == (void*)-1)
{
perror("shmat error");
exit(0);
}
for(i=0;i<10;i++)
{
printf("MAN::name:%s;",(p_map+i)->name);
printf("MAN::arg:%d\n",(p_map+i)->age);
}
if(shmdt(p_map) == -1)
{
perror("detach error");
}
return 0;
}
运行结果:
key=87348
shm_id=819216
MAN::name:b;MAN::arg:10
MAN::name:c;MAN::arg:11
MAN::name:d;MAN::arg:12
MAN::name:e;MAN::arg:13
MAN::name:f;MAN::arg:14
MAN::name:g;MAN::arg:15
MAN::name:h;MAN::arg:16
MAN::name:i;MAN::arg:17
MAN::name:j;MAN::arg:18
MAN::name:k;MAN::arg:19
后续将会对以上内容进行c++封装