子进程继承了内存映射mmap导致flock文件锁泄露

发布时间:2024年01月03日

背景

想要利用文件锁在进程退出时自动释放的机制,让守护进程管擦某些资源的释放,并执行相关清理/重启工作。然而发现守护进程在父进程退出时永远饿死。
?

问题伪代码

主进程子进程

安装信号捕获,每当有信号时print并退出,对子进程也生效
fd=打开文件
flock文件
mmap映射内存
fork子进程

---

---

等待键盘输入

根据键盘输入,①close文件再等待②直接退出进程

---

setsid或捕获信号防止随父进程退出而提前终止

关闭文件

打开文件

flock文件

清理代码

退出进程

问题代码的预期行为

主进程在等待键盘输入后关闭文件或不关闭文件立即退出,或③ctrl c。然后子进程会加锁成功并执行清理代码。

问题代码的实际行为

父进程退出后,子进程堵塞无法继续。

通过lsof、lslock等查看发现仅有子进程对此锁文件有关,并且堵塞于取得写锁中。

测试分析结果

子进程必须先munmap文件,才能真正释放从父进程继承下来的锁。

代码

文章来源:https://blog.csdn.net/superzmy/article/details/135358673
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。