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

背景

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

问题伪代码

主进程子进程

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

---

---

等待键盘输入

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

---

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

关闭文件

打开文件

flock文件

清理代码

退出进程

问题代码的预期行为

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

问题代码的实际行为

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

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

测试分析结果

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

代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值