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?
/proc/self
Oczywiście proces, który ocenia .Odpowiedzi:
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/self
wskazuje?”, Po prostu wybiera aktualnie zaplanowany pid , tj . Aktualnie uruchomiony proces (na bieżącym logicznym procesorze). Efekt jest taki, że/proc/self
zawsze wskazuje na pid programu pytającego; jeśli ucieknieszzobaczysz
ls
pid, jeśli napiszesz kod, który używa/proc/self
tego kodu, zobaczy swój własny pid itp.źródło
/proc/self
jako część ścieżki w jednym ze swoich argumentów.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.
źródło
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.źródło
/proc/self
nie jest sterownikiem urządzenia, ale jest częścią systemu plików narażonego na jądro o nazwieprocfs
./proc
sterownika 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.Niezależnie od tego, który proces się uzyskuje, uzyskuje się dostęp
/proc/self
do 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ędzyt
a/
), 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żels -l /proc/self/exe
; będzie wskazywać na plik wykonywalny ls.Lub spróbuj tego, dla odmiany:
lub nawet
Jak powiedziałem, jest to proces, do którego dochodzi,
/proc/self
lub dostęp do znajdujących się w nim plików / folderów.źródło
/ 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ć:
'/ 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:
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:
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 / *.
źródło
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.
źródło