Jika saya memulai suatu proses dan kemudian menghapus binernya, saya masih dapat memulihkannya dari /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
Di sisi lain, jika saya membuat tautan simbolis sendiri, hapus target dan coba salin:
cp: cannot stat ‘sleep’: No such file or directory
/proc
adalah antarmuka ke kernel. Jadi, apakah tautan simbolis ini benar-benar menunjuk ke salinan yang dimuat di memori, tetapi dengan nama yang lebih berguna? Bagaimana cara exe
tautan berfungsi, tepatnya?
Jawaban yang Diterima:
/proc/<pid>/exe
tidak mengikuti semantik normal untuk tautan simbolik. Secara teknis ini mungkin dianggap sebagai pelanggaran terhadap POSIX, tetapi /proc
bagaimanapun juga adalah sistem file khusus.
/proc/<pid>/exe
tampaknya menjadi symlink ketika Anda stat
dia. Ini adalah cara yang nyaman bagi kernel untuk mengekspor nama path yang diketahuinya untuk proses yang dapat dieksekusi. Tetapi ketika Anda benar-benar membuka "file" itu, tidak ada prosedur normal membaca isi symlink berikut. Sebaliknya kernel hanya memberi Anda akses ke entri file yang terbuka secara langsung.
Perhatikan bahwa ketika Anda ls -l
sebuah /proc/<pid>/exe
pseudofile untuk proses yang eksekusinya telah dihapus, target symlink memiliki string "(dihapus)" di akhir. Ini biasanya tidak masuk akal dalam symlink:pasti tidak ada file yang hidup di jalur target dengan nama yang diakhiri dengan ” (dihapus)”.
tl;dr proc
implementasi sistem file melakukan hal ajaibnya sendiri dengan resolusi nama jalur.