Browse Source

解决shm_destroy中分离共享内存后访问共享内存结构体指针内部成员导致崩溃的问题,因为分离共享内存后,共享内存结构体指针指向的地址已经从进程空间中移除,是无效的地址,再访问就会造成段错误

test
gaorui 1 week ago
parent
commit
b9b34d51a3
  1. 9
      1_shared_memory/shared_memory.c

9
1_shared_memory/shared_memory.c

@ -244,6 +244,11 @@ void shm_detach_only(SharedMem *shm) {
void shm_destroy(SharedMem *shm) {
if (shm == NULL) return;
// 调用shmdt分离共享内存后,shm已经从当前进程空间移除,即shm指向的是无效的进程空间地址
// 所以此处将信号量id提前拷贝出来保存,防止分离共享内存后访问信号量时出错
// 保存信号量ID(在分离共享内存前)
int sem_id = shm->sem_id;
// 1. 分离共享内存
shmdt(shm);
@ -254,8 +259,8 @@ void shm_destroy(SharedMem *shm) {
}
// 3. 删除信号量(检查资源是否存在)
if (shm->sem_id != -1) {
semctl(shm->sem_id, 0, IPC_RMID);
if (sem_id != -1) {
semctl(sem_id, 0, IPC_RMID);
}
}

Loading…
Cancel
Save