7

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

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

如果父进程被杀死(并且子进程还活着),我偶尔会遇到死锁。所有程序都fcntl.flock()永远阻塞。尝试从外部获取锁也会永远阻塞。我必须杀死儿童程序来解决问题。

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

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

4

1 回答 1

3

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

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

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

于 2012-03-09T01:49:59.943 回答