Untuk proses apa `/ proc / self /`?

40

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?

Tim
sumber
15
Proses yang mengevaluasi /proc/self, tentu saja.
Charles Duffy
8
Orang mana yang saya dan saya rujuk?
Jeffrey Bosboom

Jawaban:

64

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/selfmaksudnya?", Kernel hanya memilih pid yang saat ini dijadwalkan , yaitu proses yang sedang berjalan (pada CPU logis saat ini). Efeknya adalah bahwa /proc/selfselalu menunjuk ke pid program meminta; jika kamu lari

ls -l /proc/self

Anda akan melihat lspid, jika Anda menulis kode yang menggunakan /proc/selfkode itu akan melihat pid sendiri, dll.

Stephen Kitt
sumber
13
Ini "akurat" dalam arti tertentu, tetapi tidak berarti bagi seseorang yang tidak memahami konsep kernel "saat ini". Sebuah jawaban yang lebih baik akan bahwa itu proses membuat sistem panggilan dengan /proc/selfsebagai bagian dari pathname di salah satu argumen.
R ..
1
@R .. itulah yang menyoroti jawaban ilkkachu , jangan ragu untuk mengunggah yang itu - saya lakukan.
Stephen Kitt
36

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.

ilkkachu
sumber
27

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.

Slebetman
sumber
6
/proc/selfbukan driver perangkat, melainkan bagian dari filesystem kernel yang dipanggil procfs.
Chris Down
1
@ChrisDown: Ya tapi ini diterapkan sebagai modul kernel - yang merupakan versi driver perangkat linux - bahkan ada contoh implementasi /procdriver 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.
slebetman
7
@slebetman juga, procfs bukanlah modul, itu hanya dapat dibangun, tidak pernah dibangun sebagai modul. Jika Anda ingin membelah rambut, rambut yang harus dibelah adalah bahwa itu adalah driver sistem file, bukan driver perangkat
hobbs
10

Itu proses mana pun yang mengakses /proc/selfatau file / folder di dalamnya.

Coba cat /proc/self/cmdline. Anda akan mendapatkan, kejutan cat /proc/self/cmdline,, (sebenarnya, alih-alih spasi akan ada karakter nol antara tdan /) 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 bagaimana ls -l /proc/self/exe; itu akan menunjuk ke dieksekusi ls.

Atau coba ini, untuk perubahan:

$ cp /proc/self/cmdline /tmp/cmd
$ hexdump -C /tmp/cmd
00000000  63 70 00 2f 70 72 6f 63  2f 73 65 6c 66 2f 63 6d  |cp./proc/self/cm|
00000010  64 6c 69 6e 65 00 2f 74  6d 70 2f 63 6d 64 00     |dline./tmp/cmd.|
0000001f

atau bahkan

$ hexdump -C /proc/self/cmdline 
00000000  68 65 78 64 75 6d 70 00  2d 43 00 2f 70 72 6f 63  |hexdump.-C./proc|
00000010  2f 73 65 6c 66 2f 63 6d  64 6c 69 6e 65 00        |/self/cmdline.|
0000001e

Seperti yang saya katakan, itu adalah proses mana pun yang diakses /proc/selfatau file / folder di dalamnya.

Viktor Toth
sumber
2

/ 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:

root@vps01:~# ls -l /proc/self/fd
total 0
lrwx------ 1 root root 64 Jan  1 01:51 0 -> /dev/pts/0
lrwx------ 1 root root 64 Jan  1 01:51 1 -> /dev/pts/0
lrwx------ 1 root root 64 Jan  1 01:51 2 -> /dev/pts/0
lr-x------ 1 root root 64 Jan  1 01:51 3 -> /proc/26562/fd
root@vps01:~# echo $$
593

'/ 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:

root@vps01:~# ls /proc/self/fd
0  1  2  3
root@vps01:~/specs# echo /proc/self/fd/*
/proc/self/fd/0 /proc/self/fd/1 /proc/self/fd/2 /proc/self/fd/255 /proc/self/fd/3

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:

root@vps01:~# cd /proc/self/fd
root@vps01:~# ls
0  1  2  255

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 / *.

Barry J. Burns
sumber
-2

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.

LHP
sumber