如何在POSIX共享内存中使用结构?

问题描述

我希望我的POSIX共享内存段符合特定的结构。我认为这段代码以结构的形式创建了共享内存段。

(File creating the shared memory segment)

typedef struct {
  int cnt;
  char buf[segsize];
} shmseg_t;

int shm_fd = shm_open(shm_name,O_CREAT | O_RDWR,0666);
ftruncate(shm_fd,sizeof(shmseg_t);
void* addr = mmap(NULL,sizeof(shmseg_t),PROT_READ | PROT_WRITE,MAP_SHARED,shm_fd,0);

如何将文件中的数据写入共享内存中结构的不同字段?

(File writing to the shared memory segment)

int shm_fd = shm_open(shm_name,O_WRONLY,0);
ftruncate(shm_fd,segsize);
void* addr = mmap(NULL,segsize,PROT_WRITE,0);
// How do I get shmp,which should be a shmseg_t struct?
shmp->cnt = read(fd,shmp->buf,segsize);

如何获取共享内存中写入结构的数据?

(File reading from the shared memory segment)

int shm_fd = shm_open(shm_name,O_RDONLY,PROT_READ,0);
// How to get out shmp->cnt and shmp->buf?

解决方法

不清楚是要共享整个结构还是仅共享buf

选项1:buf用作指针,并共享其指向的对象。

typedef struct {
  int cnt;
  char *buf;
} shmseg_t;

ftruncate(shm_fd,segsize);
void* addr = mmap(NULL,segsize,PROT_READ | PROT_WRITE,MAP_SHARED,shm_fd,0);
assert(addr != MAP_FAILED);

shm_seg_t shmp = {
    .cnt = ???,// Whatever value of cnt you want.
    .buf = addr,};

选项2:。共享整个结构。

typedef struct {
  int cnt;
  char buf[segsize];
} shmseg_t;

ftruncate(shm_fd,sizeof(shmseg_t));
void* addr = mmap(NULL,sizeof(shmseg_t),0);
assert(addr != MAP_FAILED);

shm_seg_t *shmp = addr;

如果以这种方式共享,则读写之间并没有什么不同(但是您确实需要使用内存屏障或同步)。