问题描述
我希望我的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;
如果以这种方式共享,则读写之间并没有什么不同(但是您确实需要使用内存屏障或同步)。