背景
想要利用文件锁在进程退出时自动释放的机制,让守护进程观察某些资源的释放,并执行相关清理/重启工作。然而发现守护进程在父进程退出时永远饿死。
问题伪代码
主进程 | 子进程 |
安装信号捕获,每当有信号时print并退出,对子进程也生效 --- --- 等待键盘输入 根据键盘输入,①close文件再等待②直接退出进程 | --- setsid或捕获信号防止随父进程退出而提前终止 关闭文件 打开文件 flock文件 清理代码 退出进程 |
问题代码的预期行为
主进程在等待键盘输入后关闭文件或不关闭文件立即退出,或③ctrl c。然后子进程会加锁成功并执行清理代码。
问题代码的实际行为
父进程退出后,子进程堵塞无法继续。
通过lsof、lslock等查看发现仅有子进程对此锁文件有关,并且堵塞于取得写锁中。
测试分析结果
子进程必须先munmap文件,才能真正释放从父进程继承下来的锁。
代码