首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带flock、fork和终止父进程的死锁

问带flock、fork和终止父进程的死锁
EN

Stack Overflow用户
提问于 2012-02-02 11:59:21
回答 1查看 2.5K关注 0票数 7

我有一个非常复杂的python程序。在内部,它有一个使用独占(LOCK_EX) fcntl.flock来管理全局锁定的日志记录系统。实际上,每当日志消息被转储时,都会获取全局文件锁,将消息发送到文件(与锁文件不同),并释放全局文件锁。

该程序还会多次派生自身(在设置日志管理之后)。一般来说,一切都会正常工作。

如果父进程被杀死(而子进程还活着),我偶尔会得到一个死锁。所有程序都会在fcntl.flock()上永久阻塞。尝试从外部获取锁也会永远阻塞。我不得不终止儿童程序来解决这个问题。

然而,令人费解的是,lsof lock_file没有显示持有锁的进程!所以我不知道为什么这个文件被内核锁住了,但是没有任何进程被报告为持有它。

flock在分叉方面有问题吗?死的父级是否以某种方式持有锁,即使它不再在进程表中?我该如何解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-09 09:50:00

几乎可以肯定的是,lsof没有显示flock()锁,所以看不到锁并不能说明是否存在锁。

flock()锁是通过fd-sharing (dup()系统调用,或使文件保持打开状态的fork- and -exec )继承的,任何具有共享描述符的人都可以解锁该锁,但如果该锁已被持有,则任何再次锁定它的尝试都将被阻止。所以,是的,很可能是父级锁定了描述符,然后死了,让描述符保持锁定状态。子进程随后也会尝试锁定并阻塞,因为描述符已经锁定。(如果子进程锁定文件,然后终止,也会发生同样的情况。)

因为` `fcntl()‘锁是针对每个进程的,所以快死的进程会释放它的所有锁,这样您就可以继续了,这就是您在这里想要的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9106997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档