Browse Source

解决崩溃问题

test
gaorui 2 weeks ago
parent
commit
da946e1c4d
  1. 13
      shared_memory/shared_memory.c

13
shared_memory/shared_memory.c

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

Loading…
Cancel
Save