Jeśli to zrobię (w powłoce Bourne'a):
exec 3> file 4>&3 5> file 6>> file
Deskryptory plików 3 i 4, ponieważ 4 był dup()
edytowany z 3, dzielą ten sam otwarty opis pliku (te same właściwości, to samo przesunięcie w pliku ...). Chociaż deskryptory plików 5 i 6 tego procesu znajdują się w innym otwartym opisie pliku (na przykład każdy z nich ma własny wskaźnik w pliku).
Teraz w lsof
wyniku widzimy tylko:
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
Jest trochę lepiej z 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
(tutaj w Linuksie 3.16), ponieważ widzimy, że fd 6 ma inne flagi, więc musi to być inny opis otwartego pliku niż ten na fd 3, 4 lub 5, ale z tego nie wiemy, że fd 5 jest na inny opis otwartego pliku . Za pomocą -o
możemy również zobaczyć przesunięcie, ale ponownie to samo przesunięcie nie gwarantuje, że jest to ten sam opis otwartego pliku .
Czy jest jakiś nieinwazyjny 1 sposób, aby się tego dowiedzieć? Zewnętrznie, czy dla własnych deskryptorów plików procesu?
1 . Jednym heurystycznym podejściem może być zmiana flag jednego fd za pomocą fcntl()
i sprawdzenie, w jaki sposób inne deskryptory plików mają zaktualizowane flagi, ale to oczywiście nie jest idealny ani głupi dowód