在C中向共享内存结构深写数据失败

zxlwwiss  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(144)

我使用shm_open()在c语言中申请了一块共享内存,然后使用mmap()将其转换为Struct MinHeap* 类型。由于MinHeap结构体内部有struct Element elementd[16],我如何修改元素的值?我按照下面的方法做了,但当程序运行到init_elm()并试图分配标志时失败。

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;//---------------------------------WRONG HERE
    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;
}

char* shm_file = SHM_FILE_NAME;
size_t  shm_size = 32*sizeof(struct MinHeap);
key_t shm_fd = shm_open(SHM_FILE_NAME,O_CREAT|O_RDWR, 0666);
ftruncate(shm_fd,shm_size);
struct MinHeap* mhp_p = (struct MinHeap*)mmap(0,shm_size,PROT_READ,MAP_SHARED,shm_fd,0);/*MinHeap pointer to shared memory*/
init_heap(mhp_p);
5uzkadbs

5uzkadbs1#

根据您给出的代码,init elm()方法似乎是正确的,语句elm-〉flag=FREE;应该按预期发挥作用。
代码中还有一个潜在的问题是,您试图使用带有PROT_READ标志的mmap()函数修改只读的共享内存段。|PROT_WRITE标志如下所示
struct MinHeap* mhp_p = (struct MinHeap*)mmap(0,shm_size,PROT_READ|PROT_WRITE,MAP_SHARED,shm_fd,0);
这将允许您使用MinHeap指针修改共享内存段,包括结构Element数组的元素。

补充建议

行strcpy(elm-〉name,“Unamended”);在访问共享内存区域时,如果Element结构体的name字段没有正确初始化,则可能会发生分段错误或其他无法定义的行为。
可以使用与标准结构体指针相同的语法来更改共享内存区域的元素。例如,您可以采取以下操作来更改共享内存区域中第一个元素的标志字段:
mhp_p->elements[0].flag = NEW_VALUE;
其中NEW VALUE表示应该输入到标志字段中的值。

相关问题