我想在多个进程之间共享一个结构列表,并将它们包装到另一个结构中,这样我就可以轻松跟踪我的计数和大小。
首先,我创建结构并将共享内存分配给它们。
#define LEN 20
typedef struct msg_struct{
int id;
char topic[64];
};
typedef struct msg_list{
int max;
int cur_index;
struct msg_struct* data;
};
struct msg_list* allocate_list_memory(key_t key){
int id = shmget(key, LEN * sizeof(struct msg_struct), IPC_CREAT | 0666);
struct msg_struct* struct_list = (struct msg_struct*)shmat(id, NULL, 0);
int id2 = shmget(key+1, sizeof(struct msg_list), IPC_CREAT | 0666);
struct msg_list* list = (struct msg_list*)shmat(id2, NULL, 0);
list->max = (int)LEN;
list->data = struct_list;
return list;
}
void add_to_memory(struct msg_list* list, struct msg_struct* msg) {
//if we have space left just write to it
if(list->cur_index < list->max) {
list->data[list->cur_index].id == msg->id;
list->data[list->cur_index].topic = msg->topic;
list->cur_index++;
}
....
}
另一种方法是将一个给定的msg obejct添加到我的消息列表中。
main(int argc, char *argv[]) {
char* result = NULL;
struct msg_struct* msg;
msg = (struct msg_struct*)malloc(sizeof(struct msg_struct));
msg->id = 123;
strncpy(msg->topic, "TEST", 10);
struct msg_list* list = allocate_list_memory(1111);
add_to_memory(list, msg);
....
}
我的add_to_memory
函数正在抛出一个SIGSEGV,我真的不知道为什么。其他示例和教程并没有真正帮助我正确地做到这一点。