dpkg
(e por sua vez o apt) não usa flock(2)
para bloqueio. Verificando as chamadas do sistema, envolvidas, parece que elas usam fcntl(2)
:
$ sudo strace -f -e trace=desc apt install foo |& grep -B2 F_SETLK
close(4) = 0
open("/var/lib/dpkg/lock", O_RDWR|O_CREAT|O_NOFOLLOW, 0640) = 4
fcntl(4, F_SETFD, FD_CLOEXEC) = 0
fcntl(4, F_SETLK, {l_type=F_WRLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = -1 EAGAIN (Resource temporarily unavailable)
close(4) = 0
E de esta postagem do SO :
No Linux,
lockf()
é apenas um wrapper em torno defcntl()
, enquantoflock()
os bloqueios são separados (e só funcionam em sistemas de arquivos locais, não em por exemplo. Montagens NFS). Ou seja, um processo pode ter uma consultoria exclusivaflock()
bloqueia em um arquivo, enquanto outro processo tem um avisofcntl()
exclusivo bloqueia no mesmo arquivo. Ambos são bloqueios consultivos, mas eles não interagem.
Portanto, flock
não é eficaz em bloqueá-lo em relação a outros comandos de gerenciamento de pacotes. (Pensando nisso ... se fosse, então o subsequente apt-get
teria falhado de qualquer maneira.)