Apa perbedaan symlink / proc / <pid> / exe dari symlink biasa?

23

Jika saya memulai 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

/procadalah antarmuka ke kernel. Jadi apakah tautan simbolis ini sebenarnya menunjuk ke salinan yang dimuat dalam memori, tetapi dengan nama yang lebih berguna? Bagaimana cara exekerja tautan, tepatnya?

muru
sumber

Jawaban:

19

/proc/<pid>/exetidak mengikuti semantik normal untuk tautan simbolik. Secara teknis ini mungkin dianggap sebagai pelanggaran POSIX, tetapi bagaimanapun juga /procadalah sistem file khusus.

/proc/<pid>/exetampaknya menjadi symlink saat Anda statmenggunakannya. Ini adalah cara yang nyaman bagi kernel untuk mengekspor pathname yang diketahuinya untuk proses yang dapat dieksekusi. Tetapi ketika Anda benar-benar membuka "file" itu, tidak ada prosedur normal untuk membaca isi symlink berikut. Alih-alih, kernel hanya memberi Anda akses ke entri file yang terbuka secara langsung.

Perhatikan bahwa ketika Anda ls -lsebuah /proc/<pid>/exepseudofile untuk suatu proses yang executable-nya telah dihapus target symlink memiliki string "(dihapus)" di akhir itu. Ini biasanya tidak masuk akal dalam symlink: pasti tidak ada file yang hidup di jalur target dengan nama yang diakhiri dengan "(dihapus)".

tl; dr The procpelaksanaan filesystem hanya melakukan hal sihir sendiri dengan resolusi pathname.

Celada
sumber
1
Dan keajaiban tinggal di proc_exe_link()dalam sistem procfile: lxr.free-electrons.com/source/fs/proc/base.c?v=4.0#L1350
Stephen Kitt
Bagaimana Anda tahu pasti tidak ada file dengan nama seperti itu? Seseorang mungkin telah membuatnya sebagai eksperimen; Saya pernah melakukannya sekali sebelumnya. Sangat tidak mungkin itu akan ada karena alasan lain, tetapi masih bukan tidak mungkin.
flarn2006
4

Menurut halaman manual / proc, di Linux 2.2 dan yang lebih baru, file tersebut adalah tautan simbolik yang berisi pathname aktual dari perintah yang dieksekusi. Rupanya, biner dimuat ke dalam memori, dan /proc/[pid]/exemenunjuk ke konten biner dalam memori .

Di sisi lain, di bawah Linux 2.0 dan sebelumnya, /proc/[pid]/exetampaknya adalah penunjuk ke file (dalam sistem file) yang dieksekusi.

Jadi jika Anda menjalankan daftar perintah yang sama di Linux 2.0 atau sebelumnya, mungkin Anda akan mendapatkan kesalahan "tidak ada file atau direktori".

dr01
sumber
Halaman mana? linux.die.net/man/5/proc dan manpages.ubuntu.com/manpages/utopic/en/man5/proc.5.html mengatakan "mencoba membukanya akan membuka executable", tetapi tidak mengatakan di mana itu datang dari.
muru
1
Saya cukup yakin kernel memberi Anda konten inode untuk biner, daripada salinannya di dalam memori. Salinan dalam memori tidak mungkin berisi semua bagian file. Inode, di sisi lain, dihitung-referensi dan tidak akan ditimpa ketika referensi ada. Kernel akan menyimpan referensi untuk mengeksekusi file sehingga dapat memuat bagian tambahan jika perlu.
Tandai