C语言向共享内存写入MinHeap结构体失败问题求助
共享内存映射后无法修改元素的问题分析与修复
问题根源
- 内存权限不足:
mmap调用时仅指定PROT_READ只读权限,后续对共享内存的写入操作会触发段错误,这是导致init_elm中flag赋值失败的直接原因。 - 文件描述符类型错误:
shm_open的返回值是int类型,代码中错误定义为key_t(该类型用于ftok生成键值),可能导致后续ftruncate、mmap操作异常。 - 依赖宏未明确:代码中使用的
FREE、CAPACITY、SHM_FILE_NAME、INT_MIN需确保已正确定义,否则会出现编译或运行错误。
修复后的代码
#include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <limits.h> #include <unistd.h> #include <stdio.h> // 按需定义必要宏 #define SHM_FILE_NAME "/my_minheap_shm" #define CAPACITY 16 #define FREE 0 struct Element{ int flag; int id; char name[32]; }; struct MinHeap{ struct Element elements[16]; int size; int capacity; }; void init_elm(struct Element* elm){ elm->flag = FREE; elm->id = -1; strcpy(elm->name, "Unamed"); } void init_heap(struct MinHeap* heap){ for(int i = 0; i < CAPACITY; i++){ init_elm(&(heap->elements[i])); } heap->elements[0].id = INT_MIN; heap->capacity = CAPACITY; heap->size = 0; } int main(){ // 打开/创建共享内存对象 int shm_fd = shm_open(SHM_FILE_NAME, O_CREAT | O_RDWR, 0666); if(shm_fd == -1){ perror("shm_open failed"); return 1; } // 设置共享内存大小(若仅需一个MinHeap实例,无需乘以32) size_t shm_size = sizeof(struct MinHeap); if(ftruncate(shm_fd, shm_size) == -1){ perror("ftruncate failed"); close(shm_fd); return 1; } // 映射共享内存,添加PROT_WRITE权限 struct MinHeap* mhp_p = (struct MinHeap*)mmap(0, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); if(mhp_p == MAP_FAILED){ perror("mmap failed"); close(shm_fd); return 1; } // 初始化堆结构 init_heap(mhp_p); // 清理资源 munmap(mhp_p, shm_size); close(shm_fd); return 0; }
额外说明
- 若需要在共享内存中存储多个
MinHeap实例,再调整shm_size为32 * sizeof(struct MinHeap)即可。 - 所有系统调用(
shm_open、ftruncate、mmap)都建议添加错误处理,便于快速定位问题。
内容的提问来源于stack exchange,提问作者hytang
相关产品推荐
相关产品推荐

