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

如何在POSIX共享内存中使用struct?,c,posix,shared-memory,C,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* a

我希望我的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?
我如何从共享内存中取出写入结构的数据

(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;

如果您以这种方式共享,那么读取和写入实际上并没有什么不同(但您确实需要使用内存屏障或同步)。

似乎您要问两个截然不同的问题—如何将结构封送到文件或从文件中解封送,以及如何与共享内存交互。这些可以更好地表达为不同的SO问题帖子吗?我删除了关于如何共享
shmseg_t
struct的typedef的第二个问题。为什么在三个不同的地方调用
ftruncate
?共享内存区域的大小不是固定的吗?您是否尝试过
shmp=addr
?我想分享整个结构,
shmp->cnt
是使用文件描述符
fd
从文件读取到
shmp->buf
@bard的字节数:这是“选项2”。不要使用
assert
进行代码中非逻辑错误的错误检查。@HAL9000:我花了一点时间思考如何确认应该从
mmap
检查结果,我的想法是,“我想明确指出,您应该检查
mmap
的结果,但我不想在我的答案中引入大量正确处理错误的额外代码,因为这将使代码片段更长、更不清晰。
assert
函数是最短、最清晰的方法,我将使用它。在这里对错误处理进行全面讨论是不合适的,因此我相信人们会做正确的事情。”@HAL9000:我担心有人会发表像你这样的评论,我想我的担心是有道理的。将来我可能会决定写不那么清晰、措辞更狡猾的答案,这样我就可以避免再次进行这种对话。