Se eu fizer isso (em um shell tipo Bourne):
exec 3> file 4>&3 5> file 6>> file
Descreva os descritores 3 e 4, pois 4 foi dup()
ed de 3, compartilhe a mesma descrição do arquivo aberto (mesmas propriedades, o mesmo deslocamento dentro do arquivo ...). Embora os descritores de arquivo 5 e 6 desse processo estejam em uma descrição de arquivo aberto diferente (por exemplo, cada um deles tem seu próprio ponteiro no arquivo).
Agora, em lsof
output, tudo que vemos é:
zsh 21519 stephane 3w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 4w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 5w REG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 6w REG 254,2 0 10505865 /home/stephane/file
É um pouco melhor com lsof +fg
:
zsh 21519 stephane 3w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 4w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 5w REG W,LG 254,2 0 10505865 /home/stephane/file
zsh 21519 stephane 6w REG W,AP,LG 254,2 0 10505865 /home/stephane/file
(aqui no Linux 3.16) em que vemos que o fd 6 tem flags diferentes, então tem que haver uma descrição do arquivo aberto diferente daquela em fd 3, 4 ou 5, mas a partir disso não podemos dizer que o fd 5 está em uma descrição de arquivo aberto diferente. Com -o
, também podemos ver o deslocamento, mas novamente o mesmo offset não garante a mesma descrição do arquivo aberto .
Existe alguma maneira não intrusiva 1 para descobrir isso? Externamente, ou para descritores de arquivos próprios do processo?
1 . Uma abordagem heurística poderia ser alterar os sinalizadores de um fd com fcntl()
e ver como outros descritores de arquivo têm seus sinalizadores atualizados, mas isso obviamente não é ideal nem à prova de erros