Linux
與 fcntl 鎖關聯的文件描述符重複?
根據手冊頁
dup2
,此系統呼叫會生成舊文件描述符的新副本。這兩個描述符不共享(close-on-exec 標誌)。但是,如果我們試圖複製的文件描述符有一個與之關聯的 fcntl 鎖,那麼新的文件描述符是否會獲得一個新的鎖?
Posix 鎖(F_SETLK 等)與程序相關聯,因此在 a 之後
dup2()
您仍然只有一個文件鎖。您可以使用 列出您的鎖lslocks
。如果您關閉 2 個 fds 之一,您將放棄鎖定。如果您使用其中一個 fd 更改鎖,則另一個也會更改。之後fork()
孩子沒有鎖。有關詳細資訊,請參見fcntl
手冊頁。這個Posix 規範說dup2()
將共享任何鎖。您可以使用 Python 進行簡單的測試,
lockf()
以便於使用,因為它是通過 實現的fcntl()
,例如:#!/usr/bin/python import os, fcntl pid = os.getpid() fd = open("/tmp/try","rw") fcntl.lockf(fd,fcntl.LOCK_SH,10) fd2 = os.dup(fd.fileno()) os.system("lslocks -p %d" % pid) # one lock fd.close() os.system("lslocks -p %d" % pid) # no output