Liên kết / Proc / <pid> / exe khác với các liên kết thông thường như thế nào?


23

Nếu tôi bắt đầu một quá trình và sau đó xóa nhị phân của nó, tôi vẫn có thể khôi phục nó từ /proc/<pid>/exe:

$ cp `which sleep` .
$ ./sleep 10m &
[1] 13728
$ rm sleep
$ readlink /proc/13728/exe                           
/tmp/sleep (deleted)
$ cp /proc/13728/exe ./sleep-copy
$ diff sleep-copy `which sleep` && echo not different
not different
$ stat /proc/13728/exe 
  File: ‘/proc/13728/exe’ -> ‘/tmp/sleep (deleted)’
  Size: 0           Blocks: 0          IO Block: 1024   symbolic link

Mặt khác, nếu tôi tự tạo một liên kết tượng trưng, ​​hãy xóa mục tiêu và cố gắng sao chép:

cp: cannot stat ‘sleep’: No such file or directory

/proclà một giao diện cho kernel. Vì vậy, liên kết tượng trưng này thực sự trỏ đến bản sao được tải trong bộ nhớ, nhưng với một tên hữu ích hơn? Làm thế nào để exeliên kết hoạt động, chính xác?

Câu trả lời:


19

/proc/<pid>/exekhông tuân theo ngữ nghĩa thông thường cho các liên kết tượng trưng. Về mặt kỹ thuật, điều này có thể được coi là vi phạm POSIX, nhưng rốt cuộc /proclà một hệ thống tệp đặc biệt.

/proc/<pid>/exedường như là một liên kết tượng trưng khi bạn statnó. Đây là một cách thuận tiện để kernel xuất tên đường dẫn mà nó biết để thực thi quy trình. Nhưng khi bạn thực sự mở "tập tin" đó, không có quy trình đọc thông thường nào sau đây về nội dung của một liên kết tượng trưng. Thay vào đó, kernel chỉ cung cấp cho bạn quyền truy cập vào mục nhập tệp đang mở trực tiếp.

Chú ý rằng khi bạn ls -lmột /proc/<pid>/exepseudofile cho một quá trình mà thực thi đã được xóa mục tiêu liên kết tượng trưng có chuỗi "(xóa)" ở phần cuối của nó. Điều này thường không nhạy cảm trong một liên kết tượng trưng: chắc chắn không có tệp nào tồn tại ở đường dẫn đích có tên kết thúc bằng "(đã xóa)".

tl; dr Việc proctriển khai hệ thống tập tin chỉ thực hiện điều kỳ diệu của riêng nó với độ phân giải tên đường dẫn.


1
Và phép màu tồn tại proc_exe_link()trong prochệ thống tập tin: lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350
Stephen Kitt

Làm thế nào để bạn biết chắc chắn không có một tập tin với tên như vậy? Ai đó có thể đã tạo ra một như một thử nghiệm; Tôi đã làm nó một lần trước đây. Không có khả năng nó sẽ tồn tại vì bất kỳ lý do nào khác, nhưng vẫn không phải là không thể.
flarn2006

4

Theo trang man của / Proc, trong Linux 2.2 trở lên, tệp là một liên kết tượng trưng chứa tên đường dẫn thực tế của lệnh được thực thi. Rõ ràng, nhị phân được tải vào bộ nhớ và /proc/[pid]/exetrỏ đến nội dung của nhị phân trong bộ nhớ .

Mặt khác, trong Linux 2.0 trở về trước, /proc/[pid]/exerõ ràng là một con trỏ tới tệp (trong hệ thống tệp) đã được thực thi.

Vì vậy, nếu bạn đã chạy cùng một danh sách các lệnh trên Linux 2.0 trở về trước, có lẽ bạn sẽ gặp lỗi "không có tệp hoặc thư mục như vậy".


Trang nào? linux.die.net/man/5/procmanpages.ubfox.com/manpages/utopic/en/man5/proc.5.html nói "cố gắng mở nó sẽ mở tệp thực thi", nhưng không nói nó ở đâu đến từ.
muru

1
Tôi khá chắc chắn hạt nhân cung cấp cho bạn nội dung của inode cho nhị phân, chứ không phải là bản sao trong bộ nhớ của nó. Bản sao trong bộ nhớ không có khả năng chứa tất cả các phần của tệp. Mặt khác, các nút được tính tham chiếu và sẽ không bị ghi đè trong khi các tham chiếu tồn tại. Nhân sẽ giữ một tham chiếu để thực thi các tệp để nó có thể tải các phần bổ sung nếu cần thiết.
Đánh dấu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.