From b9b34d51a3604eb91d2c1c272303a6d73237303e Mon Sep 17 00:00:00 2001 From: gaorui Date: Fri, 12 Dec 2025 11:31:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3shm=5Fdestroy=E4=B8=AD?= =?UTF-8?q?=E5=88=86=E7=A6=BB=E5=85=B1=E4=BA=AB=E5=86=85=E5=AD=98=E5=90=8E?= =?UTF-8?q?=E8=AE=BF=E9=97=AE=E5=85=B1=E4=BA=AB=E5=86=85=E5=AD=98=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BD=93=E6=8C=87=E9=92=88=E5=86=85=E9=83=A8=E6=88=90?= =?UTF-8?q?=E5=91=98=E5=AF=BC=E8=87=B4=E5=B4=A9=E6=BA=83=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E5=9B=A0=E4=B8=BA=E5=88=86=E7=A6=BB=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=E5=86=85=E5=AD=98=E5=90=8E=EF=BC=8C=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E5=86=85=E5=AD=98=E7=BB=93=E6=9E=84=E4=BD=93=E6=8C=87=E9=92=88?= =?UTF-8?q?=E6=8C=87=E5=90=91=E7=9A=84=E5=9C=B0=E5=9D=80=E5=B7=B2=E7=BB=8F?= =?UTF-8?q?=E4=BB=8E=E8=BF=9B=E7=A8=8B=E7=A9=BA=E9=97=B4=E4=B8=AD=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=EF=BC=8C=E6=98=AF=E6=97=A0=E6=95=88=E7=9A=84=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=EF=BC=8C=E5=86=8D=E8=AE=BF=E9=97=AE=E5=B0=B1=E4=BC=9A?= =?UTF-8?q?=E9=80=A0=E6=88=90=E6=AE=B5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1_shared_memory/shared_memory.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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); } }