|
|
|
@ -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); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|