Si hago (en una cáscara de Bourne-like):
exec 3> file 4>&3 5> file 6>> file
Los descriptores de archivo 3 y 4, dado que 4 se dup()
editó a partir de 3, comparten la misma descripción de archivo abierto (mismas propiedades, mismo desplazamiento dentro del archivo ...). Mientras que los descriptores de archivo 5 y 6 de ese proceso están en una descripción de archivo abierta diferente (por ejemplo, cada uno tiene su propio puntero en el archivo).
Ahora, en la lsof
salida, todo lo que vemos es:
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
Es un poco mejor con 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
(aquí en Linux 3.16) en el que vemos que fd 6 tiene diferentes indicadores, por lo que debe ser una descripción de archivo abierto diferente de la de fd 3, 4 o 5, pero a partir de eso no podemos decir que fd 5 está en un Descripción de archivo abierto diferente . Con -o
, también podríamos ver el desplazamiento, pero de nuevo el mismo desplazamiento no garantiza que sea la misma descripción de archivo abierto .
¿Hay alguna forma no intrusiva de descubrirlo? Externamente, o para un proceso de propios descriptores de archivos?
1 . Un enfoque heurístico podría ser cambiar las marcas de un fcntl()
archivo con y ver qué otros descriptores de archivos tienen sus banderas actualizadas como resultado, pero eso obviamente no es ideal ni a prueba de tontos