python – 与flock,fork和终止父进程的死锁
发布时间:2020-12-20 13:26:22 所属栏目:Python 来源:网络整理
导读:我有一个非常复杂的 python程序.在内部,它有一个日志系统,它使用独占(LOCK_EX)fcntl.flock来管理全局锁定.实际上,无论何时转储日志消息,都会获取全局文件锁,将消息发送到文件(与锁定文件不同)并释放全局文件锁. 该程序也多次自行分配(在设置日志管理之后).
我有一个非常复杂的
python程序.在内部,它有一个日志系统,它使用独占(LOCK_EX)fcntl.flock来管理全局锁定.实际上,无论何时转储日志消息,都会获取全局文件锁,将消息发送到文件(与锁定文件不同)并释放全局文件锁.
该程序也多次自行分配(在设置日志管理之后). 如果父进程被杀死(并且孩子们还活着),我偶尔会陷入僵局.所有程序永远阻止fcntl.flock().试图从外部获取锁也永远阻止.我必须杀死儿童程序来解决问题. 令人困惑的是,lsof lock_file显示没有持有锁的进程!所以我无法弄清楚为什么文件被内核锁定但没有报告过程持有它. flock有分叉问题吗?即使不再在进程表中,死父也会以某种方式持有锁吗?我该如何解决这个问题? 解决方法
lsof几乎可以肯定不会显示flock()锁,所以不会看到一个没有告诉你是否有一个.
flock()锁通过fd-sharing(dup()系统调用或fork-and-exec继承)使文件保持打开状态,任何拥有共享描述符的人都可以解锁,但是如果已经锁定,则任何尝试再次锁定它会阻止.所以,是的,父母很可能锁定了描述符,然后死了,导致描述符被锁定.然后,子进程也会尝试锁定并阻塞,因为描述符已被锁定. (如果子进程锁定文件,那么会发生同样的情况,然后就死了.) 由于`fcntl()’锁是按进程进行的,因此死亡进程会释放所有锁,以便您可以继续,这就是您想要的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |