与 fcntl 锁关联的文件描述符的重复?

与 fcntl 锁关联的文件描述符的重复?

根据 的手册页dup2,此系统调用创建旧文件描述符的新副本。这两个描述符不共享(close-on-exec 标志)。

但是,如果我们尝试复制的文件描述符具有与之关联的 fcntl 锁,那么新文件描述符是否会获得新锁?

答案1

Posix 锁(F_SETLK 等)与进程关联,因此在 a 之后,dup2()您在文件上仍然只有一个锁。您可以使用 列出您的锁lslocks。如果你关闭 2 个 fd 之一,你就会失去锁。如果你改变其中一个 fd 的锁,另一个也会改变。之后,fork()孩子就没有锁了。有关详细信息,请参阅fcntl手册页。这Posix 规范dup2()共享任何锁

lockf()为了便于使用,您可以使用 Python 进行简单的测试,因为它是通过 实现的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

相关内容