C/C++ code#include
#include
#include
#include
#include
typedef struct test
{
char a[256];
char *b;
char c[256];
} test;
#define SHM_CREATE 1
#define SHM_LOAD 0
#define SHM_FILE "/var/test.shm"
#define SHM_SIZE 8000
char *
init_shm (const int flag, char *pathname, const unsigned long size, int shmid)
{
char *ret = NULL;
int shm_id = 0;
key_t key = ftok (pathname, 'R');
if (SHM_CREATE == flag) // 新建
{
shm_id = shmget (key, size, IPC_CREAT | IPC_EXCL | 0600);
if (-1 == shm_id)
{
shm_id = shmget (key, size, 0);
if (-1 == shm_id)
{
perror ("init_shm shmget create");
return NULL;
}
}
printf("shm_id = %d\n", shm_id);
if ((ret = shmat (shm_id, (char *) 0xb7f17000, 0)) == (void *)-1) {
perror("shmat");
exit(1);
}
memset (ret, 0, size);
}
else
{/*
shm_id = shmget (key, size, 0);
if (shm_id == -1)
{
perror ("init_shm shmget load");
return NULL;
}
*/
ret = shmat (shmid, (char *)0xb7f17000, 0);
}
return ret;
}
int
main (int argc, char **argv)
{
int shmid;
char *arg = argv[1];
if (argc != 3) {
printf("Usage: %s cmd shmid\n", argv[0]);
exit(1);
}
if (*arg == 'c')
{
system ("touch " SHM_FILE); // create shm file
printf("SHM_FILE' size = %d\n", SHM_SIZE);
test *t = (struct test *) init_shm (SHM_CREATE, SHM_FILE, SHM_SIZE, shmid);
t->b = t->c;
if (t)
{
printf("t->a size = %d\n", sizeof(t->a));
//t->b =(char *) t + sizeof(t->a);
printf ("addr = 0x%08x/0x%08x\n", (unsigned int)t->b, (unsigned int)t);
strcpy (t->a, "AAAA");
strcpy (t->b, "111");
printf ("a=%s,b=%s\n", t->a, t->b);
}
}
else if (*arg == 'l')
{
shmid = atoi(argv[2]);
test *t = (struct test *) init_shm (SHM_LOAD, SHM_FILE, SHM_SIZE, shmid);
printf ("addr = 0x%08x/0x%08x\n",(unsigned int)t->b, (unsigned int)t);
//t->b = (char *)t + sizeof(struct test); // 重新定位b的位置
if (t)
{
printf ("a=%s,b=%s\n", t->a, t->b);
}
}
return 0;
}