Linux中shm_unlink()执行逻辑疑问:自动unmap还是等待进程操作?
关于
shm_unlink()的行为澄清 嘿,这个疑问太正常了——手册里的描述确实有点模棱两可,我来给你把逻辑捋清楚~
先把你提到的手册原文放出来:
shm_unlink()的操作与unlink(2)类似:它会移除一个内存对象名称,并且一旦所有进程都已解除映射该对象,就会释放并销毁相关内存区域的内容。成功调用shm_unlink()后,尝试用相同名称shm_open()该对象会失败(除非指定了O_CREAT,此时会创建一个全新的独立对象)。
核心要点其实和文件系统的unlink()完全一致,咱们拆解来看:
shm_unlink()只负责移除共享内存对象的“名称”,简单说就是让这个名字从系统里消失,后续其他进程没法再通过这个名字打开它了,但它不会主动去强制任何已映射该对象的进程解除映射。- 共享内存对象的生命周期和它的“名称”是分开的:只要还有进程通过
mmap()持有该对象的映射,这块内存就会一直存在于内核中,里面的内容也会好好保留着。 - 只有当最后一个持有映射的进程调用
munmap()解除映射之后,内核才会真正释放这块内存区域,彻底销毁里面的内容。
举个实际场景的例子帮你理解:
- 进程A创建并映射了名为
/my_shared_mem的共享内存; - 进程B通过这个名称打开并映射了它,现在A和B都能读写同一块内存;
- 进程A调用
shm_unlink("/my_shared_mem")——这时候这个名称被删掉了,进程C再想shm_open("/my_shared_mem")会直接失败(除非加上O_CREAT参数,那会创建一个全新的独立对象); - 但这时候A和B仍然可以正常读写自己映射的内存区域,完全不受
shm_unlink的影响; - 直到进程A调用
munmap()解除映射,之后进程B也调用munmap(),这时候内核发现没有进程再用这块内存了,才会销毁它并释放资源。
所以结论很明确:shm_unlink()不会自动让所有进程解除映射,它只是给共享内存“除名”,真正的销毁要等到所有使用者都主动解除映射之后才会发生。
内容的提问来源于stack exchange,提问作者Abhay Patil
相关产品推荐
相关产品推荐

