https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-proc-self.html kata
The
/proc/self/
direktori link ke proses yang sedang berjalan.
Selalu ada banyak proses yang berjalan secara bersamaan, jadi proses mana yang merupakan "proses yang sedang berjalan"?
Apakah "proses yang sedang berjalan" ada hubungannya dengan proses mana yang saat ini berjalan pada CPU, mempertimbangkan pengalihan konteks?
Apakah "proses yang sedang berjalan" tidak ada hubungannya dengan proses latar depan dan latar belakang?
/proc/self
, tentu saja.Jawaban:
Ini tidak ada hubungannya dengan proses latar depan dan latar belakang; itu hanya ada hubungannya dengan proses yang sedang berjalan. Ketika kernel harus menjawab pertanyaan "Apa
/proc/self
maksudnya?", Kernel hanya memilih pid yang saat ini dijadwalkan , yaitu proses yang sedang berjalan (pada CPU logis saat ini). Efeknya adalah bahwa/proc/self
selalu menunjuk ke pid program meminta; jika kamu lariAnda akan melihat
ls
pid, jika Anda menulis kode yang menggunakan/proc/self
kode itu akan melihat pid sendiri, dll.sumber
/proc/self
sebagai bagian dari pathname di salah satu argumen.Yang mengakses symlink (memanggil readlink () di atasnya, atau membuka () di jalur yang melewatinya). Itu akan berjalan pada CPU pada saat itu, tetapi itu tidak relevan. Sistem multiprosesor dapat memiliki beberapa proses pada CPU secara bersamaan.
Proses latar depan dan latar belakang sebagian besar merupakan konstruksi shell, dan juga tidak ada proses latar depan yang unik, karena semua sesi shell pada sistem akan memilikinya.
sumber
Kata-kata itu bisa saja lebih baik tetapi sekali lagi kata-kata yang Anda coba buat untuk menyatakan ide referensi diri akan membingungkan. Nama direktori lebih deskriptif menurut saya.
Pada dasarnya, ini
/proc/self/
merupakan proses yang membaca/proc/self/
. Jadi, jika Anda mencoba untuk membuka/proc/self/
dari program C maka itu mewakili program itu. Jika Anda mencoba melakukannya dari shell maka itu adalah shell dll.Tetapi bagaimana jika Anda memiliki CPU quad core yang mampu menjalankan 4 proses secara bersamaan, nyata, bukan multitasking?
Maka setiap proses akan melihat perbedaan
/proc/self/
nyata tanpa dapat melihat satu sama lain/proc/self/
.Bagaimana cara kerjanya?
Yah,
/proc/self/
sebenarnya bukan folder. Ini adalah pengandar perangkat yang kebetulan menampilkan dirinya sebagai folder jika Anda mencoba mengaksesnya. Ini karena mengimplementasikan API yang diperlukan untuk folder. The/proc/self/
direktori bukanlah satu-satunya hal yang melakukan hal ini. Pertimbangkan folder bersama yang dipasang dari server jarak jauh atau pemasangan USB thumbdrives atau dropbox. Mereka semua bekerja dengan mengimplementasikan set API yang sama yang membuatnya berperilaku seperti folder.Ketika suatu proses mencoba mengakses
/proc/self/
driver perangkat akan menghasilkan isinya secara dinamis dengan membaca data dari proses itu. Jadi file-file dalam/proc/self/
tidak benar-benar ada. Ini seperti cermin yang memantulkan kembali proses yang mencoba melihatnya.Apakah ini benar-benar driver perangkat? Anda terdengar seperti Anda terlalu menyederhanakan hal!
Ya, benar. Jika Anda ingin menjadi bertele-tele itu adalah modul kernel. Tetapi jika Anda melihat posting usenet di berbagai saluran pengembang Linux, sebagian besar pengembang kernel menggunakan "driver perangkat" dan "modul kernel" secara bergantian. Saya dulu menulis driver perangkat, err ... modul kernel, untuk Linux. Jika Anda ingin menulis antarmuka Anda sendiri
/proc/
, katakan misalnya Anda menginginkan/proc/unix.stackexchange/
sistem file yang mengembalikan posting dari situs web ini, Anda dapat membaca tentang bagaimana melakukannya di buku "Linux Device Drivers" yang dihormati yang diterbitkan oleh O'Reilly. Itu bahkan tersedia sebagai softcopy online.sumber
/proc/self
bukan driver perangkat, melainkan bagian dari filesystem kernel yang dipanggilprocfs
./proc
driver berbasis di buku terhormat "Linux Device Drivers". Saya harus tahu, saya menerapkannya di perguruan tinggi. Saya mungkin bisa menggunakan istilah "modul kernel" sebagai gantinya tetapi "driver perangkat" adalah apa yang kebanyakan orang kenal dan saya tidak ingin memberikan kesan yang menyesatkan bahwa ada perbedaan yang signifikan antara "modul kernel" dan "driver perangkat" terlepas dari terminologi.Itu proses mana pun yang mengakses
/proc/self
atau file / folder di dalamnya.Coba
cat /proc/self/cmdline
. Anda akan mendapatkan, kejutancat /proc/self/cmdline
,, (sebenarnya, alih-alih spasi akan ada karakter nol antarat
dan/
) karena itu akan menjadi proses kucing mengakses pseudofile ini.Ketika Anda melakukan
ls -l /proc/self
, Anda akan melihat pid dari proses ls itu sendiri. Atau bagaimanals -l /proc/self/exe
; itu akan menunjuk ke dieksekusi ls.Atau coba ini, untuk perubahan:
atau bahkan
Seperti yang saya katakan, itu adalah proses mana pun yang diakses
/proc/self
atau file / folder di dalamnya.sumber
/ proc / self adalah gula sintaksis. Ini adalah jalan pintas ke contatenating / proc / dan hasil dari getpid () syscall (dapat diakses di bash sebagai metavariable $$). Ini bisa membingungkan, dalam hal skrip shell, karena banyak pernyataan memanggil proses lain, lengkap dengan PID sendiri ... PID yang merujuk, lebih sering daripada tidak, proses mati. Mempertimbangkan:
'/ bin / ls' akan mengevaluasi jalur ke direktori, menyelesaikannya sebagai / proc / 26563, karena itulah PID dari proses - proses / bin / ls yang baru dibuat - yang membaca isi direktori. Tetapi pada saat proses selanjutnya dalam pipeline, dalam kasus scripting shell, atau pada saat prompt kembali, dalam kasus shell interaktif, jalan tidak lagi ada dan output informasi mengacu pada proses yang tidak ada.
Ini hanya berlaku untuk perintah eksternal, namun (yang merupakan file program yang dapat dieksekusi, sebagai lawan dibangun ke dalam shell itu sendiri). Jadi, Anda akan mendapatkan hasil yang berbeda jika, misalnya, menggunakan nama file globbing untuk mendapatkan daftar isi direktori, daripada meneruskan nama path ke proses eksternal / bin / ls:
Pada baris pertama, shell memunculkan proses baru, '/ bin / ls', melalui syscall exec (), lewat "/ proc / self / fd" sebagai argv [1]. '/ bin / ls', pada gilirannya, membuka direktori / proc / self / fd dan membaca, lalu mencetak, isinya seperti yang diulang di atasnya.
Namun, baris kedua menggunakan glob () di belakang layar untuk memperluas daftar nama file; ini dilewatkan sebagai larik string yang bergema. (Biasanya diimplementasikan sebagai perintah internal, tetapi sering juga ada biner / bin / gema ... tetapi bagian itu sebenarnya tidak relevan, karena gema hanya berurusan dengan string yang tidak pernah diumpankan ke syscall yang terkait dengan nama path.)
Sekarang, pertimbangkan kasus berikut:
Di sini, shell, proses induk dari / bin / ls, telah membuat subdirektori dari / proc / self direktori saat ini . Dengan demikian, nama path relatif dievaluasi dari perspektifnya. Tebakan terbaik saya adalah bahwa ini terkait dengan semantik file POSIX di mana Anda dapat membuat banyak tautan keras ke file, termasuk deskriptor file terbuka. Jadi kali ini, / bin / ls berperilaku serupa dengan echo / proc / $$ / fd / *.
sumber
Karena shell memanggil program seperti ls dalam proses yang terpisah, / proc / self akan muncul sebagai symlink ke nnnnn , di mana nnnnn adalah ID proses dari proses ls. Sejauh yang saya tahu, kerang yang biasa digunakan tidak memiliki builtin untuk membaca symlink, tetapi Perl memiliki:
perl -e 'print "/ proc / self link:", readlink ("/ proc / self"), "- pid $$ \ n";'
Jadi / proc / self berperilaku sebagai symlink, tetapi filesystem procfs membuatnya "secara ajaib" sadar proses.
sumber