Чем символическая ссылка / 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это. Это удобный способ для ядра экспортировать путь, который он знает для исполняемого файла процесса. Но когда вы действительно открываете этот «файл», нет обычной процедуры чтения следующего содержимого символической ссылки. Вместо этого ядро ​​просто дает вам доступ к открытой записи файла напрямую.

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

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

Celada
источник
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 или более ранней версии, вероятно, вы получите сообщение об ошибке «нет такого файла или каталога».

dr01
источник
Какая man-страница? linux.die.net/man/5/proc и manpages.ubuntu.com/manpages/utopic/en/man5/proc.5.html говорят, что «попытка открыть его откроет исполняемый файл», но не говорит, где он происходит от.
Муру
1
Я уверен, что ядро ​​предоставляет вам содержимое inode для двоичного файла, а не его копию в памяти. Копия в памяти вряд ли будет содержать все разделы файла. Inode, с другой стороны, подсчитывают ссылки и не будут перезаписаны, пока ссылки существуют. Ядро сохранит ссылку на исполняемые файлы, чтобы при необходимости загрузить дополнительные разделы.
Марк