Duplicação de um descritor de arquivo associado a um bloqueio de fcntl?

0

De acordo com a página do manual de dup2 , este syscall cria uma nova cópia do descritor de arquivo antigo. Os dois descritores não compartilham (o sinalizador close-on-exec).

No entanto, no caso de o descritor de arquivo que estamos tentando duplicar ter um bloqueio fcntl associado a ele, o novo descritor de arquivo obtém um novo bloqueio?

    
por Bionix1441 15.09.2016 / 15:03

1 resposta

1

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
    
por 15.09.2016 / 18:22

Tags