2015-01-08 42 views
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()釋放文件鎖?

+1

因爲鎖由兩個進程持有 - 父和子繼承它 - 而文件鎖使用「引用計數」類語義。 –

回答

2

子進程從父進程繼承文件描述符。並且可以在不同的OS進程之間爲同一個文件共享「鎖定」(即鎖定點)。

您也可以指定close_fds=True來關閉子文件。 close_fds=True是Python 3中POSIX系統上的默認設置。

自Python 3.4以來,新創建的文件描述符在默認情況下是非可繼承的。請參閱PEP 446