与群,死叉和终止父进程的死锁

时间:2012-02-02 03:59:21

标签: python locking fork fcntl flock

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

程序也会多次分叉(在设置日志管理之后)。 一般来说一切正常。

如果父进程被杀死(并且孩子还活着),我偶尔会陷入僵局。所有程序永远阻止fcntl.flock()。试图从外部获取锁也永远阻止。我必须杀死孩子们的程序来解决这个问题。

令人困惑的是,lsof lock_file显示没有进程持有锁!所以我无法弄清楚为什么文件被内核锁定,但没有报告过程控制它。

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

1 个答案:

答案 0 :(得分:1)

lsof几乎肯定不会显示flock()锁定,所以没有看到它会告诉你是否有一个。

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

由于`fcntl()'锁是按进程进行的,因此死亡进程会释放其所有锁,以便您可以继续,这就是您想要的。