|
|
@ -148,11 +148,14 @@ void shm_detach_only(SharedMem *shm) { |
|
|
shmdt(shm); // 仅分离,不删除
|
|
|
shmdt(shm); // 仅分离,不删除
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 销毁共享内存(父进程用,删除内核资源)
|
|
|
// 修复后的 shm_destroy 函数
|
|
|
void shm_destroy(SharedMem *shm) { |
|
|
void shm_destroy(SharedMem *shm) { |
|
|
if (shm == NULL) return; |
|
|
if (shm == NULL) return; |
|
|
|
|
|
|
|
|
// 1. 分离共享内存
|
|
|
// 关键:先保存sem_id到临时变量(在shmdt之前)
|
|
|
|
|
|
int sem_id_temp = shm->sem_id; |
|
|
|
|
|
|
|
|
|
|
|
// 1. 分离共享内存(分离后shm指针失效,不可再访问)
|
|
|
shmdt(shm); |
|
|
shmdt(shm); |
|
|
|
|
|
|
|
|
// 2. 删除共享内存(检查资源是否存在)
|
|
|
// 2. 删除共享内存(检查资源是否存在)
|
|
|
@ -161,9 +164,9 @@ void shm_destroy(SharedMem *shm) { |
|
|
shmctl(shm_id, IPC_RMID, NULL); |
|
|
shmctl(shm_id, IPC_RMID, NULL); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// 3. 删除信号量(检查资源是否存在)
|
|
|
// 3. 删除信号量(用临时变量判断,避免访问失效的shm指针)
|
|
|
if (shm->sem_id != -1) { |
|
|
if (sem_id_temp != -1) { |
|
|
semctl(shm->sem_id, 0, IPC_RMID); |
|
|
semctl(sem_id_temp, 0, IPC_RMID); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|