/ Proc / <pid> / exe sembolik bağıntısının sıradan sembolik bağlantılardan farkı nedir?


23

Bir işlemi başlatıp sonra ikili kodunu silersem, yine de ondan kurtarabilirim /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

Öte yandan, kendime sembolik bir bağ kurarsam hedefi silin ve kopyalamaya çalışın:

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

/procçekirdeğe bir arayüzdür. Öyleyse bu sembolik bağlantı aslında bellekte yüklü olan kopyaya işaret ediyor, ancak daha yararlı bir isimle mi? exeBağlantı tam olarak nasıl çalışır?

Yanıtlar:


19

/proc/<pid>/exesembolik linkler için normal anlambilim izlemez. Teknik olarak bu POSIX'in ihlali olarak sayılabilir ancak /procsonuçta özel bir dosya sistemidir.

/proc/<pid>/exeSiz statolduğunuzda bir sembolik bağlantı gibi görünüyor. Bu, çekirdeğin 'yürütülebilir' işlem için bildiği yol adını vermesi için uygun bir yoldur. Ancak bu "dosyayı" gerçekten açtığınızda, bir sembolik bağlantıyı izleyen normal okuma prosedürlerinden hiçbiri yoktur. Bunun yerine çekirdek, doğrudan açık dosya girişine erişmenizi sağlar.

Bildirim o zaman ls -lbir /proc/<pid>/exeyürütülebilir olmuştur Sembolik bağ hedefi silindi bunun sonunda "(silindi)" dizesi olan bir süreç için pseudofile. Bu normalde bir sembolik bağlantıda duyusal olmaz: kesinlikle "(silinmiş)" ile biten bir adla hedef yolda yaşayan bir dosya yoktur.

tl; Dr.proc dosya sistemi uygulaması sadece yol adı çözünürlüğü ile kendi sihirli şeyi yapar.


1
Ve sihirli yaşıyor proc_exe_link()içinde proc: dosya sistemi lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350
Stephen Kitt

Kesinlikle böyle bir isimde bir dosya olmadığını nereden biliyorsunuz? Birisi bir deney olarak yaratmış olabilir; Daha önce bir kere yaptım. Başka bir nedenden ötürü varolması pek mümkün değil, ama yine de imkansız değil.
flarn2006

4

/ Proc'un man sayfasına göre, Linux 2.2 ve sonrasında, dosya yürütülen komutun asıl yolunu içeren sembolik bir bağlantıdır. Görünüşe göre, ikili hafızaya yüklenir /proc/[pid]/exeve ikili içeriğe işaret eder bellekte .

Öte yandan, Linux 2.0 ve daha önceki sürümlerde, /proc/[pid]/exegörünüşe göre dosyası infaz edildi (dosya sisteminde).

Bu yüzden aynı komut listesini Linux 2.0 veya daha önceki bir sürümde çalıştırdıysanız, muhtemelen "böyle bir dosya veya dizin yok" hatası alırsınız.


Hangi sayfa? linux.die.net/man/5/proc ve manpages.ubuntu.com/manpages/utopic/en/man5/proc.5.html demek "o çalıştırılabilir açılacaktır açmaya çalışırken", ama nerede bunu söylemez gelen.
muru

1
Çekirdeğin, bellek içi kopyası yerine ikili dosyadaki inode içeriğini verdiğinden eminim . Bellek içi kopya, dosyanın tüm bölümlerini içeremez. Diğer taraftan, inode'lar referans sayılır ve referanslar varken üzerine yazılmaz. Çekirdek, dosyaları çalıştırmaya bir referans tutacaktır, böylece gerekirse ek bölümleri yükleyebilir.
Mark,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.