Se eu fizer (em um shell tipo Bourne):
exec 3> file 4>&3 5> file 6>> file
Os descritores de arquivo 3 e 4, desde que 4 foi dup()
editado a partir de 3, compartilham a mesma descrição de 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 diferente de arquivo aberto (por exemplo, cada um deles tem seu próprio ponteiro no arquivo).
Agora, na lsof
saída, tudo o 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), pois vemos que o fd 6 tem sinalizadores diferentes; portanto, deve haver uma descrição de arquivo aberto diferente daquela do fd 3, 4 ou 5, mas disso não podemos dizer que o fd 5 está em um descrição diferente do arquivo aberto . Com -o
, também pudemos ver o deslocamento, mas novamente o mesmo deslocamento não garante a mesma descrição de arquivo aberto .
Existe alguma não-intrusiva 1 maneira de descobrir isso? Externamente, ou para os próprios descritores de arquivo de um processo?
1 . Uma abordagem heurística poderia ser alterar os sinalizadores de um fd fcntl()
e ver com que outros descritores de arquivos têm seus sinalizadores atualizados como resultado, mas isso obviamente não é o ideal nem a prova de idiotas