Как символическая ссылка / proc / <pid> / exe отличается от обычных символических ссылок?

Если я запустил процесс, а затем удалю его двоичный код, я все равно могу его восстановить из /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 ссылка?

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

/proc/<pid>/exe представляется символической ссылкой, когда вы ставите ее. Это удобный способ для ядра экспортировать имя пути, которое он знает для исполняемого файла процесса. Но когда вы действительно открываете этот «файл», нет никакой обычной процедуры чтения содержимого символьной ссылки. Вместо этого ядро ​​просто дает вам доступ к открытой записи файла напрямую.

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

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

Согласно странице man / proc, в Linux 2.2 и более поздних версиях файл представляет собой символическую ссылку, содержащую фактический путь к исполняемой команде. По-видимому, двоичный файл загружается в память, а /proc/[pid]/exe указывает на содержимое двоичного файла в памяти .

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

Поэтому, если вы запустили тот же список команд в Linux 2.0 или более ранних версиях, предположительно, вы получите ошибку «нет такого файла или каталога».