Nếu tôi làm (trong một vỏ giống như Bourne):
exec 3> file 4>&3 5> file 6>> file
Mô tả tệp 3 và 4, vì 4 được chỉnh sửa dup()
từ 3, chia sẻ cùng một mô tả tệp đang mở (cùng thuộc tính, cùng một phần bù trong tệp ...). Trong khi các mô tả tệp 5 và 6 của quá trình đó nằm trên một mô tả tệp mở khác nhau (ví dụ: mỗi mô tả có con trỏ riêng trong tệp).
Bây giờ, trong lsof
đầu ra, tất cả những gì chúng ta thấy là:
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
Tốt hơn một chút với 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
(ở đây trên Linux 3.16) ở chỗ chúng ta thấy fd 6 có các cờ khác nhau, vì vậy nó phải là một mô tả tệp mở khác với mô tả trên fd 3, 4 hoặc 5, nhưng từ đó chúng ta không thể biết fd 5 đang ở trên một mô tả tập tin mở khác nhau . Với -o
, chúng ta cũng có thể thấy phần bù, nhưng một lần nữa phần bù không đảm bảo đó là phần mô tả tệp mở giống nhau .
Có không xâm nhập bất kỳ 1 cách để tìm mà ra? Bên ngoài, hoặc cho mô tả tập tin riêng của một quá trình?
1 . Một cách tiếp cận heuristic có thể là thay đổi cờ của một fd fcntl()
và xem kết quả của các mô tả tệp khác có cờ của họ được cập nhật như thế nào, nhưng rõ ràng đó không phải là lý tưởng cũng không phải là bằng chứng ngu ngốc