Як симпосилання / proc / <pid> / exe відрізняється від звичайних посилань?


23

Якщо я запускаю процес, а потім видаляю двійковий файл, я все одно можу відновити його з /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

З іншого боку, якщо я сам зроблю символічне посилання, видаліть ціль і спробуйте скопіювати:

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

/procє інтерфейсом до ядра. Так це символічне посилання насправді вказує на копію, завантажену в пам'ять, але з більш корисним іменем? Як саме працює exeпосилання?

Відповіді:


19

/proc/<pid>/exeне дотримується нормальної семантики для символічних посилань. Технічно це може вважатися порушенням POSIX, але /procвсе-таки є спеціальною файловою системою.

/proc/<pid>/exeвиявляється символьним посиланням, коли ви statйого. Це зручний спосіб, щоб ядро ​​експортувало ім'я шляху, яке воно знає, для виконуваного процесу. Але коли ви фактично відкриваєте цей "файл", немає жодної нормальної процедури зчитування наступного вмісту символьної посилання. Натомість ядро ​​просто надає вам доступ до відкритого файлу безпосередньо.

Зверніть увагу , що коли ви pseudofile для процесу, виконуваного був видалена метою символьного посилання має рядок «(видалено)» в кінці. Зазвичай це не є чуттєвим у символьному посиланні: напевно немає файлу, який живе на цільовому шляху з іменем, що закінчується на "(видалено)".ls -l/proc/<pid>/exe

tl; dr Реалізація procфайлової системи просто робить свою власну магію з роздільною здатністю імені.


1
І диво живе в proc_exe_link()в procфайлової системі: lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350
Стівен Кітт

Звідки ви знаєте, що точно не існує файлу з таким ім'ям? Хтось, можливо, створив би його як експеримент; Я робив це один раз раніше. Не дуже ймовірно, що вона існуватиме з будь-якої іншої причини, але все ж не неможлива.
flarn2006

4

Згідно з довідковою сторінкою / proc, під Linux 2.2 та пізніших версій файл є символічним посиланням, що містить фактичну назву шляху виконаної команди. Мабуть, двійковий файл завантажується в пам'ять і /proc/[pid]/exeвказує на вміст двійкового у пам'яті .

З іншого боку, під Linux 2.0 і новіших версій, /proc/[pid]/exeмабуть, вказівник на файл (у файловій системі), який був виконаний.

Отже, якщо ви запустили один і той же список команд на Linux 2.0 або раніше, імовірно, ви отримаєте помилку "немає такого файлу чи каталогу".


Яка сторінка? linux.die.net/man/5/proc та manpages.ubuntu.com/manpages/utopic/en/man5/proc.5.html сказати: "спроба відкрити це відкриє виконуваний файл", але не говорить, де це походить від.
муру

1
Я впевнений, що ядро ​​надає вам вміст утворень для двійкового файлу, а не копію в пам'яті. Копія в пам'яті навряд чи містить усі розділи файлу. З іншого боку, вклади підраховуються і не перезаписуються, поки існують посилання. Ядро збереже посилання на виконання файлів, щоб воно могло завантажувати додаткові розділи, якщо це необхідно.
Марк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.