簡體   English   中英

如何在 POSIX 共享內存中使用結構體?

[英]How to use struct in POSIX shared memory?

我希望我的 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, MAP_SHARED, shm_fd, 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, 0);
ftruncate(shm_fd, segsize);
void* addr = mmap(NULL, segsize, PROT_READ, MAP_SHARED, shm_fd, 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),
                  PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
assert(addr != MAP_FAILED);

shm_seg_t *shmp = addr;

如果以這種方式共享,讀取和寫入並沒有真正不同(但您確實需要使用內存屏障或同步)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM