Jika saya melakukannya (dalam shell seperti Bourne):
exec 3> file 4>&3 5> file 6>> file
File deskriptor 3 dan 4, karena 4 adalah dup()
ed dari 3, berbagi deskripsi file terbuka yang sama (properti yang sama, offset yang sama dalam file ...). Sementara deskriptor file 5 dan 6 dari proses tersebut berada pada deskripsi file terbuka yang berbeda (misalnya, mereka masing-masing memiliki pointer sendiri dalam file).
Sekarang, dalam lsof
output, yang kita lihat adalah:
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
Ini sedikit lebih baik dengan 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
(di sini di Linux 3.16) di mana kita melihat fd 6 memiliki flag yang berbeda, jadi itu harus menjadi deskripsi file terbuka yang berbeda dari yang ada di fd 3, 4 atau 5, tetapi dari situ kita tidak bisa mengatakan fd 5 ada di deskripsi file terbuka berbeda . Dengan -o
, kita juga bisa melihat offset, tetapi offset yang sama tidak menjamin itu adalah deskripsi file terbuka yang sama .
Apakah ada non-intrusif 1 cara untuk mengetahui bahwa? Secara eksternal, atau untuk deskriptor file proses sendiri?
1 . Salah satu pendekatan heuristik bisa dengan mengubah bendera satu fd dengan fcntl()
dan melihat apa file deskriptor lain memiliki bendera mereka diperbarui sebagai hasilnya, tapi itu jelas tidak ideal atau bukti bodoh