Os bloqueios de Posix (F_SETLK etc) estão associados a um processo, portanto, após um dup2()
, você ainda tem apenas um bloqueio em um arquivo. Você pode listar seus bloqueios com lslocks
.
Se você fechar um dos 2 fds, você derrubará o bloqueio. Se você alterar o bloqueio com um dos fds, o outro também mudará. Depois de um fork()
, a criança não tem bloqueios. Veja a página fcntl
man para detalhes. Esta especificação Posix diz que dup2()
irá partilhar os cadeados .
Você pode fazer testes simples em Python usando lockf()
para facilitar o uso, pois ele é implementado via fcntl()
, por exemplo:
#!/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