【发布时间】:2018-10-13 20:29:18
【问题描述】:
我当前的项目有问题。
这是我的标题:
#define SHARED_MEMORY_NAME "/osmpmemory"
#define OSMP_MAX_MESSAGES_PROC 16
#define OSMP_MAX_SLOTS 256
#define OSMP_MAX_PAYLOAD_LENGTH 128
typedef struct {
char msg[OSMP_MAX_PAYLOAD_LENGTH];
} osmp_msg;
typedef struct {
size_t memory_size;
int process_count;
osmp_msg slots[OSMP_MAX_SLOTS];
} shm_conf;
这里是我的代码:
shm_conf* memory_conf;
size_t shm_size = sizeof(shm_conf) + sizeof(int[count][2]) + sizeof(osmp_msg[count][OSMP_MAX_MESSAGES_PROC]);
int fd;
if((fd = shm_open(SHARED_MEMORY_NAME, O_CREAT | O_RDWR, 0640)) == -1) {
return -1;
}
if(ftruncate(fd, shm_size) == -1) {
printf("%s\n", strerror(errno));
return -1;
}
if((memory_conf = (shm_conf*)mmap(NULL, shm_size , PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED) {
printf("%s\n", strerror(errno));
return 0;
}
memory_conf->process_count = count;
memory_conf->memory_size = shm_size;
int process_numbers[memory_conf->process_count][2];
for(int i = 0; i < memory_conf->process_count; i++) {
process_numbers[i][0] = 0;
process_numbers[i][1] = i;
}
memcpy(memory_conf + sizeof(shm_conf), process_numbers, sizeof(process_numbers));
我想在 shm_conf 结构之后存储一个二维数组。但是 memcpy 给我一个分段错误,我不知道为什么,你能帮帮我吗?
在这个数组之后我想存储另一个数组,这就是为什么 shm_size 比我目前需要的大。
【问题讨论】:
-
想法:尺寸和偏移量计算往往容易出错,也许这里也是? IDK,但不是
shm_conf* memory_conf; size_t shm_size = sizeof(...,而是考虑struct { shm_conf memory_conf; int pn[count][2]; osmp_msg[count][OSMP_MAX_MESSAGES_PROC] } m; hm_size = sizeof m;并使用struct成员:memcpy(&m.pn, process_numbers, sizeof m.pn);等。 -
我无法在结构中定义
int pn[count][2]数组,因为结构中不知道变量code -
是的,你当然是对的。然而,如果可能的话,通过内存重组,内存需求的可扩展部分可以放在数组的末尾,例如使用flexible array member 的
typedef struct { int pn[2]; shm_conf c; } i_shm_conf; void fooo(int count) { struct asdf { shm_conf memory_conf; i_shm_conf is[]; } m; size_t sz = sizeof m + sizeof m.is[0] * count; }。这也避免了您的计算方法可能存在的对齐问题。
标签: c struct shared-memory mmap memcpy