1
如果我打開一個文件,獲取一個鎖,然後關閉文件:如果我在鎖定文件時啓動進程,爲什麼不在close()上釋放文件鎖定?
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()釋放文件鎖?
因爲鎖由兩個進程持有 - 父和子繼承它 - 而文件鎖使用「引用計數」類語義。 –