myshm.h
#ifndef __MYSHM_H__
#define __MYSHM_H__
#define N (1)
#define PAGESIZE (4096)
struct mydata{
int a;
int b;
};
#endif
shm_write.c
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <errno.h>
#include "myshm.h"
int main(int argc, char const *argv[])
{
int shmid;
struct mydata *p;
struct mydata data[3] = {
[0] = {
.a = 1,
.b = 2,
},
[1] = {
.a = 3,
.b = 4,
},
[2] = {
.a = 5,
.b = 6,
},
};
key_t keyval = ftok("/",'A');
shmid = shmget(keyval,N*PAGESIZE,IPC_CREAT | IPC_EXCL | 0777);
if(shmid < 0)
{
if(errno == EEXIST)
{
shmid = shmget(keyval,0,0);
}
else
{
perror("shmget");
return -1;
}
}
p = shmat(shmid, NULL, 0);
if(p == (struct mydata*)(-1))
{
perror("shmat");
return -2;
}
#if 0
strcpy(p, "hello world");
#else
printf("sizeof(data)=%lu\n", sizeof(data));
memcpy(p, data, sizeof(data));
#endif
shmdt(p);
return 0;
}
shm_read.c
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>
#include "myshm.h"
int main(int argc, char const *argv[])
{
int shmid = 0;
int i;
struct mydata *p;
key_t keyval = ftok("/",'A');
shmid = shmget(keyval, N*PAGESIZE, IPC_CREAT|IPC_EXCL|0777);
if(shmid < 0)
{
if(errno == EEXIST)
{
shmid = shmget(keyval,0,0);
}
else
{
perror("shmget");
return -1;
}
}
p = shmat(shmid, NULL, 0);
if(p == (struct mydata *)(-1))
{
perror("shmat");
return -2;
}
#if 0
printf("share memry :%s\n", p);
#else
for(i=0; i<3;++i)
printf("share mem :p[%d]=%d,p[%d]=%d\n", i, p[i].a, i, p[i].b);
#endif
shmdt(p);
return 0;
}
測試結果
C共享記憶體讀寫結構體中的内容