Czym różni się dowiązanie symboliczne / proc / <pid> / exe od zwykłych dowiązań symbolicznych?

23

Jeśli rozpocznę proces, a następnie usunę jego plik binarny, nadal mogę go odzyskać 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

Z drugiej strony, jeśli sam utworzę dowiązanie symboliczne, usuń cel i spróbuj skopiować:

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

/procjest interfejsem do jądra. Czy to dowiązanie symboliczne faktycznie wskazuje na kopię załadowaną do pamięci, ale o bardziej przydatnej nazwie? Jak exedokładnie działa link?

muru
źródło

Odpowiedzi:

19

/proc/<pid>/exenie przestrzega normalnej semantyki dla dowiązań symbolicznych. Technicznie może to być traktowane jako naruszenie POSIX, ale mimo wszystko /procjest to specjalny system plików.

/proc/<pid>/exewydaje się być dowiązaniem symbolicznym stat. Jest to wygodny sposób dla jądra na eksport nazwy ścieżki, którą zna dla pliku wykonywalnego procesu. Ale kiedy faktycznie otworzysz ten „plik”, nie ma normalnej procedury czytania następujących treści dowiązania symbolicznego. Zamiast tego jądro umożliwia bezpośredni dostęp do otwartego pliku.

Zauważ, że jeśli pseudofile dla procesu, którego wykonywalny został usunięty cel dowiązania symbolicznego ma ciąg „(skreślony)” na końcu. Zwykle nie byłoby to sensowne w dowiązaniu symbolicznym: na pewno nie ma pliku, który znajduje się na ścieżce docelowej o nazwie kończącej się na „(usunięty)”.ls -l/proc/<pid>/exe

tl; drproc wdrożenie systemu plików po prostu robi swoje własne magiczne rzeczy o rozdzielczości nazw plików.

Celada
źródło
1
I magia mieszka proc_exe_link()w procsystemie plików: lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350
Stephen Kitt
Skąd wiesz, że zdecydowanie nie ma pliku o takiej nazwie? Ktoś mógł stworzyć jeden jako eksperyment; Zrobiłem to już raz. Mało prawdopodobne, by istniał z jakiegokolwiek innego powodu, ale nadal nie jest niemożliwy.
flarn2006
4

Według strony podręcznika / proc, w Linuksie 2.2 i nowszych plik jest dowiązaniem symbolicznym zawierającym rzeczywistą nazwę ścieżki wykonanej komendy. Najwyraźniej plik binarny jest ładowany do pamięci i /proc/[pid]/exewskazuje na zawartość pliku binarnego w pamięci .

Z drugiej strony, pod Linuksem 2.0 i wcześniejszymi, /proc/[pid]/exenajwyraźniej jest wskaźnikiem do pliku (w systemie plików), który został wykonany.

Więc jeśli uruchomiłeś tę samą listę poleceń w systemie Linux 2.0 lub wcześniejszym, prawdopodobnie wystąpiłby błąd „brak takiego pliku lub katalogu”.

dr01
źródło
Która strona? linux.die.net/man/5/proc i manpages.ubuntu.com/manpages/utopic/en/man5/proc.5.html powiedzmy „próby otwarcia otworzy plik wykonywalny”, ale nie powiedzieć, gdzie go pochodzi z.
mur
1
Jestem prawie pewien, że jądro udostępnia zawartość i- węzłów dla pliku binarnego, a nie jego kopii w pamięci. Jest mało prawdopodobne, aby kopia w pamięci zawierała wszystkie sekcje pliku. Z drugiej strony, i-węzły są liczone i nie zostaną nadpisane, dopóki istnieją odniesienia. Jądro zachowa odniesienie do wykonywania plików, aby w razie potrzeby załadować dodatkowe sekcje.
Mark