You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言向共享内存写入MinHeap结构体失败问题求助

共享内存映射后无法修改元素的问题分析与修复

问题根源

  1. 内存权限不足:mmap调用时仅指定PROT_READ只读权限,后续对共享内存的写入操作会触发段错误,这是导致init_elm中flag赋值失败的直接原因。
  2. 文件描述符类型错误:shm_open的返回值是int类型,代码中错误定义为key_t(该类型用于ftok生成键值),可能导致后续ftruncate、mmap操作异常。
  3. 依赖宏未明确:代码中使用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 13:35:08