Który proces jest dla `/ proc / self /`?

40

https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-proc-self.html mówi

/proc/self/Katalogu jest link do aktualnie uruchomionego procesu.

Zawsze działa jednocześnie wiele procesów, więc który to „bieżący proces”?

Czy „aktualnie działający proces” ma coś wspólnego z tym, który proces aktualnie działa na CPU, biorąc pod uwagę przełączanie kontekstu?

Czy „aktualnie działający proces” nie ma nic wspólnego z procesami pierwszego planu i działającymi w tle?

Tim
źródło
15
/proc/selfOczywiście proces, który ocenia .
Charles Duffy,
8
Do jakiej osoby odnoszą się ja i ja ?
Jeffrey Bosboom

Odpowiedzi:

64

Nie ma to nic wspólnego z procesami pierwszego planu i tła; ma to związek tylko z aktualnie uruchomionym procesem. Kiedy jądro musi odpowiedzieć na pytanie „Na co /proc/selfwskazuje?”, Po prostu wybiera aktualnie zaplanowany pid , tj . Aktualnie uruchomiony proces (na bieżącym logicznym procesorze). Efekt jest taki, że /proc/selfzawsze wskazuje na pid programu pytającego; jeśli uciekniesz

ls -l /proc/self

zobaczysz lspid, jeśli napiszesz kod, który używa /proc/selftego kodu, zobaczy swój własny pid itp.

Stephen Kitt
źródło
13
Jest to w pewnym sensie „dokładne”, ale nie ma znaczenia dla kogoś, kto nie rozumie pojęcia „prądu” w jądrze. Lepszą odpowiedź będzie, że jest to proces podejmowania wywołanie systemowe z /proc/selfjako część ścieżki w jednym ze swoich argumentów.
R ..
1
@R .. to właśnie podkreśla odpowiedź ilkkachu , zachęcam do głosowania nad tym - zrobiłem.
Stephen Kitt,
36

Ten, który uzyskuje dostęp do dowiązania symbolicznego (wywołuje na nim readlink () lub open () na ścieżce przez nie). W tym czasie działałby na procesorze, ale to nie ma znaczenia. System wieloprocesorowy może mieć kilka procesów na CPU jednocześnie.

Procesy pierwszoplanowe i działające w tle są w większości konstruktami powłoki i nie ma też unikalnego procesu pierwszoplanowego, ponieważ wszystkie sesje powłoki w systemie będą miały jeden.

ilkkachu
źródło
27

Sformułowanie mogło być lepsze, ale z drugiej strony każde sformułowanie, które próbujesz skomponować, aby wyrazić ideę odniesienia do siebie, będzie mylące. Nazwa katalogu jest moim zdaniem bardziej opisowa.

Zasadniczo /proc/self/reprezentuje proces, który czyta /proc/self/. Więc jeśli spróbujesz otworzyć /proc/self/z programu C, oznacza to ten program. Jeśli spróbujesz to zrobić ze skorupy, to będzie to skorupa itp.

Ale co, jeśli masz czterordzeniowy procesor zdolny do jednoczesnego uruchamiania 4 procesów, a nie do wielozadaniowości?

Wówczas każdy proces zobaczy inaczej inaczej, /proc/self/bez możliwości zobaczenia się nawzajem /proc/self/.

Jak to działa?

Cóż, /proc/self/tak naprawdę nie jest folderem. Jest to sterownik urządzenia, który zdarza się ujawniać jako folder, jeśli spróbujesz uzyskać do niego dostęp. Wynika to z faktu, że implementuje interfejs API niezbędny dla folderów. /proc/self/Katalog nie jest jedyną rzeczą, która to robi. Rozważ foldery współdzielone montowane ze zdalnych serwerów lub montowania pendrivów USB lub Dropbox. Wszystkie działają, implementując ten sam zestaw interfejsów API, dzięki którym zachowują się jak foldery.

Gdy proces próbuje uzyskać dostęp /proc/self/, sterownik urządzenia generuje jego zawartość dynamicznie, odczytując dane z tego procesu. Tak więc pliki w /proc/self/rzeczywistości tak naprawdę nie istnieją. To trochę jak lustro, które odbija się od procesu, który próbuje na to spojrzeć.

Czy to naprawdę sterownik urządzenia? Brzmisz, jakbyś upraszczał rzeczy!

Tak, to prawda. Jeśli chcesz być pedantyczny, jest to moduł jądra. Ale jeśli sprawdzisz posty usenet na różnych kanałach programistów Linuksa, większość programistów jądra używa zamiennie „sterownika urządzenia” i „modułu jądra”. Kiedyś pisałem sterowniki urządzeń, err ... moduły jądra, dla Linuksa. Jeśli chcesz napisać własny interfejs /proc/, powiedz na przykład, że chcesz /proc/unix.stackexchange/systemu plików, który zwraca posty z tej witryny, możesz przeczytać o tym, jak to zrobić w czcigodnej książce „Sterowniki urządzeń Linux” opublikowanej przez O'Reilly. Jest nawet dostępny w formie elektronicznej w formie papierowej.

Slebetman
źródło
6
/proc/selfnie jest sterownikiem urządzenia, ale jest częścią systemu plików narażonego na jądro o nazwie procfs.
Chris Down
1
@ChrisDown: Tak, ale jest zaimplementowany jako moduł jądra - będący wersją sterownika urządzenia dla Linuksa - istnieje nawet przykładowa implementacja /procsterownika opartego na czcigodnej książce „Linux Device Drivers”. Powinienem wiedzieć, że wdrożyłem jeden na studiach. Prawdopodobnie mógłbym zamiast tego użyć terminu „moduł jądra”, ale „sterownik urządzenia” jest tym, co zna większość ludzi i nie chcę sprawiać mylącego wrażenia, że ​​istnieje znacząca różnica między „modułem jądra” a „sterownikiem urządzenia” oprócz terminologii.
slebetman
7
@ sllebetman no cóż, procfs nie jest modułem jako takim, może być tylko wbudowany, nigdy nie zbudowany jako moduł. Jeśli chcesz podzielić włosy, włosy to to, że jest to sterownik systemu plików, a nie sterownik urządzenia
hobbs
10

Niezależnie od tego, który proces się uzyskuje, uzyskuje się dostęp /proc/selfdo plików / folderów w nim zawartych.

Spróbować cat /proc/self/cmdline. Dostaniesz, niespodzianka, cat /proc/self/cmdline(faktycznie, zamiast przestrzeni będzie znak zerowy pomiędzy ta /), ponieważ będzie to proces kot dostępu do tej pseudofile.

Kiedy to zrobisz ls -l /proc/self, zobaczysz pid samego procesu ls. A może ls -l /proc/self/exe; będzie wskazywać na plik wykonywalny ls.

Lub spróbuj tego, dla odmiany:

$ 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

lub nawet

$ 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

Jak powiedziałem, jest to proces, do którego dochodzi, /proc/selflub dostęp do znajdujących się w nim plików / folderów.

Viktor Toth
źródło
2

/ proc / self to cukier składniowy. Jest to skrót do contatenating / proc / i wyniku polecenia getpid () syscall (dostępnego w bash jako metawaria $$). W przypadku skryptów powłoki może to być mylące, ponieważ wiele instrukcji wywołuje inne procesy wraz z własnymi PID ... PID, które odnoszą się najczęściej do martwych procesów. Rozważać:

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' oceni ścieżkę do katalogu, rozwiązując ją jako / proc / 26563, ponieważ jest to PID procesu - nowo utworzony proces / bin / ls - który czyta zawartość katalogu. Ale do czasu następnego procesu w potoku, w przypadku skryptów powłoki lub do czasu powrotu monitu, w przypadku powłoki interaktywnej ścieżka już nie istnieje, a informacje wyjściowe odnoszą się do nieistniejącego procesu.

Dotyczy to jednak tylko zewnętrznych poleceń (tych, które są rzeczywistymi plikami programów wykonywalnych, w przeciwieństwie do wbudowania w samą powłokę). Otrzymasz różne wyniki, jeśli, powiedzmy, użyjesz globowania nazw plików, aby uzyskać listę zawartości katalogu, zamiast przekazywać nazwę ścieżki do zewnętrznego procesu / 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

W pierwszym wierszu powłoka odrodziła nowy proces „/ bin / ls” za pośrednictwem syscall exec (), przekazując „/ proc / self / fd” jako argv [1]. Z kolei „/ bin / ls” otworzył katalog / proc / self / fd i przeczytał, a następnie wydrukował jego zawartość podczas iteracji nad nimi.

Druga linia używa jednak glob () za kulisami, aby rozwinąć listę nazw plików; są one przekazywane jako tablica ciągów do echa. (Zwykle implementowane jako polecenie wewnętrzne, ale często występuje również plik binarny / bin / echo ... ale ta część jest właściwie nieistotna, ponieważ echo zajmuje się tylko ciągami znaków, których nigdy nie przekazuje do żadnego wywołania systemowego związanego z nazwami ścieżek.)

Teraz rozważ następujący przypadek:

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

Tutaj powłoka, proces macierzysty / bin / ls, utworzył podkatalog / proc / self w swoim bieżącym katalogu . W związku z tym względne nazwy ścieżek są oceniane z perspektywy. Domyślam się, że jest to związane z semantyką pliku POSIX, w której można utworzyć wiele dowiązań twardych do pliku, w tym wszelkie otwarte deskryptory plików. Tym razem / bin / ls zachowuje się podobnie do echa / proc / $$ / fd / *.

Barry J. Burns
źródło
-2

Gdy powłoka wywołuje programy takie jak ls w oddzielnych procesach, / proc / self pojawi się jako dowiązanie symboliczne do nnnnn , gdzie nnnnn jest identyfikatorem procesu ls. O ile mi wiadomo, powszechnie używane powłoki nie mają wbudowanego czytnika dowiązań symbolicznych, ale Perl ma:

perl -e 'print "/ proc / self link:", readlink ("/ proc / self"), "- pid $$ \ n";'

Tak więc / proc / self zachowuje się jak dowiązanie symboliczne, ale system plików procfs czyni go „magicznie” świadomym procesu.

LHP
źródło