我使用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);
1条答案
按热度按时间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表示应该输入到标志字段中的值。