如果我在文件锁定时启动进程,为什么文件锁定没有在 close() 上释放?

Why isn't the file lock released on close() if I launch a process while the file is locked?

如果我打开文件,获取锁,然后关闭文件:

import fcntl
file = open("some_file", "w")
fcntl.flock(file.fileno(), fcntl.LOCK_EX)
file.close()

当文件关闭时,文件锁会立即释放,这是我所期望的。

但是,如果我在文件锁定时启动后台进程:

import fcntl
import subprocess
file = open("some_file", "w")
fcntl.flock(file.fileno(), fcntl.LOCK_EX)
subprocess.Popen(["python", "-c", "import time; time.sleep(10.0)"])
file.close()

以上代码立即退出,但文件锁直到后台进程结束才释放。如果我运行上面的代码然后立即再次运行它,第二个实例将阻塞十秒钟。为什么锁没有释放?

我知道我可以通过使用 LOCK_UN 调用 flock() 来显式释放锁,但这不是我要问的。我的问题是,为什么启动后台进程会阻止 close() 释放文件锁?

子进程从父进程继承文件描述符。 "locking" 可能会在不同 OS 进程之间共享同一个文件(这就是锁定点)。

您也可以指定 close_fds=True 关闭子文件。 close_fds=True 是 Python 中 POSIX 系统的默认值 3.

自 Python 3.4 以来,默认情况下新创建的文件描述符是不可继承的。参见 PEP 446