#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
char* str = "fuzhijie";
//要存储的数据
typedef struct{
char* name;
int age;
} people;
int main(int argc, char** argv)
{
int shm_id, i;
key_t key;
char temp;
people *p_map;
char* file = "/home/ecy/lili";
key = ftok(file, 0);
if(key==-1)
{
perror("ftok error");
return -1;
}
/*先用ftok创建一个key,再调用shmget,创建一块共享内存区域*/
shm_id = shmget(key, 4096, IPC_CREAT | 0660);
if(shm_id==-1)
{
perror("shmget error");
return -1;
}
/*将这块共享内存区附加到自己的内存段*/
p_map = (people*)shmat(shm_id, NULL, 0);
if (p_map == (void *)-1)
{
perror("shmat error");
return -1;
}
people p;
p.name = str;
p.age = 20;
memcpy(p_map, &p, sizeof(people));
printf("%p, %p/n", p_map, p_map->name);
return 0;
}
程序输出如下:
0xb7781000, 0x80487b0
B进程从A进程创建的共享内存中读取数据,其同样也打印出共享内存映射到它的地址空间的位置。
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
typedef struct{
char* name;
int age;
} people;
int main(int argc, char** argv)
{
int shm_id,i;
key_t key;
people *p_map;
char* name = "/home/ecy/lili";
key = ftok(name,0);
if(key == -1)
{
perror("ftok error");
return -1;
}
shm_id = shmget(key, 4096, IPC_CREAT);
if(shm_id == -1)
{
perror("shmget error");
return -1;
}
p_map = (people*)shmat(shm_id,NULL,0);
printf("%p, %p/n", p_map, p_map->name);
printf("name = %s, age = %d/n", p_map->name, p_map->age);
if(shmdt(p_map) == -1)
{
perror(" detach error ");
return -1;
}
return 0;
}
程序输出如下:
0xb78d6000, 0x80487b0
name = /home/ecy/lili, age = 20
可见共享内存在A,B进程映射的位置并不一样,在A进程中0x80487b0地址存放的是"fuzhijie"这个字符串的其实处,在B进程却不是,所以这将导致错误。A进程一部分内存情况如下:
B进程0x80487b0地址存放的内容却如下:
虽然没有访问到非法内存,但是数据是不对的,所以共享内存不能使用指针。我在网上偶然看到一句话说ACE里面的共享内存可以使用指针,有时间需要去考究一下。