Если я это сделаю (в Bourne-подобной оболочке):
exec 3> file 4>&3 5> file 6>> file
Файловые дескрипторы 3 и 4, так как 4 был dup()
отредактирован от 3, имеют одинаковое описание открытого файла (те же свойства, то же смещение внутри файла ...). В то время как файловые дескрипторы 5 и 6 этого процесса находятся в разных описаниях открытого файла (например, каждый из них имеет свой собственный указатель в файле).
Теперь в lsof
результате мы видим только:
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
Это немного лучше с 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
(здесь, в Linux 3.16), поскольку мы видим, что fd 6 имеет разные флаги, поэтому описание открытого файла должно отличаться от описания на fd 3, 4 или 5, но из этого нельзя сказать, что fd 5 находится на другое описание открытого файла . С помощью -o
мы также можем увидеть смещение, но опять же смещение не гарантирует того же описания открытого файла .
Есть ли ненавязчивые 1 способ это выяснить? Внешне или для собственных файловых дескрипторов процесса?
1 . Один эвристический подход может состоять в том, чтобы изменить флаги одного fd fcntl()
и посмотреть, как в результате у других файловых дескрипторов обновляются их флаги, но это, очевидно, не идеально и не дурак.