Pokud spustím proces a poté smažu jeho binární soubor, mohu jej stále obnovit z /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
Na druhou stranu, pokud vytvořím symbolický odkaz sám, smažu cíl a pokusím se zkopírovat:
cp: cannot stat ‘sleep’: No such file or directory
/proc
je rozhraní k jádru. Ukazuje tedy tento symbolický odkaz ve skutečnosti na kopii nahranou v paměti, ale s užitečnějším názvem? Jak funguje exe
odkaz funguje, přesně?
Přijatá odpověď:
/proc/<pid>/exe
nedodržuje běžnou sémantiku pro symbolické odkazy. Technicky se to může považovat za porušení POSIX, ale /proc
je nakonec speciální souborový systém.
/proc/<pid>/exe
se při stat
jeví jako symbolický odkaz to. Toto je pro jádro pohodlný způsob, jak exportovat cestu, kterou zná pro spustitelný soubor procesu. Ale když skutečně otevřete tento „soubor“, neexistuje žádný z běžných postupů čtení následujícího obsahu symbolického odkazu. Místo toho vám jádro poskytuje přímý přístup k otevřené položce souboru.
Všimněte si, že když ls -l
a /proc/<pid>/exe
pseudosoubor pro proces, jehož spustitelný soubor byl smazán, cíl symbolického odkazu má na konci řetězec „(deleted)“. To by normálně bylo v symbolickém odkazu nesmyslné:v cílové cestě rozhodně neexistuje soubor s názvem končícím na „ (smazáno)“.
tl;dr proc
implementace souborového systému prostě dělá své vlastní kouzlo s rozlišením cest.