diff --git a/1_shared_memory/shared_memory.c b/1_shared_memory/shared_memory.c index 5e45213..407ca29 100755 --- a/1_shared_memory/shared_memory.c +++ b/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); } }