Linux

與 fcntl 鎖關聯的文件描述符重複?

  • September 15, 2016

根據手冊頁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

引用自:https://unix.stackexchange.com/questions/310086