https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-proc-self.html sagt
Das
/proc/self/
Verzeichnis ist eine Verknüpfung zum aktuell ausgeführten Prozess.
Es werden immer mehrere Prozesse gleichzeitig ausgeführt. Welcher Prozess ist also "der aktuell ausgeführte Prozess"?
Hat "der aktuell ausgeführte Prozess" irgendetwas damit zu tun, welcher Prozess derzeit auf der CPU ausgeführt wird, unter Berücksichtigung der Kontextumschaltung?
Hat "der aktuell laufende Prozess" nichts mit Vordergrund- und Hintergrundprozessen zu tun?
/proc/self
, der natürlich bewertet .Antworten:
Dies hat nichts mit Vordergrund- und Hintergrundprozessen zu tun. es hat nur mit dem aktuell laufenden Prozess zu tun. Wenn der Kernel die Frage „Was bedeutet
/proc/self
das?“ Beantworten muss , wählt er einfach die aktuell geplante PID aus , dh den aktuell ausgeführten Prozess (auf der aktuellen logischen CPU). Der Effekt ist, dass/proc/self
immer auf die PID des fragenden Programms zeigt. wenn du läufstdu siehst
ls
's PID, wenn du Code schreibst, der diesen Code verwendet/proc/self
, siehst du seine eigene PID usw.quelle
/proc/self
als Teil des Pfadnamens in einem seiner Argumente.Derjenige, der auf den Symlink zugreift (ruft readlink () auf oder open () auf einem Pfad durch ihn). Es würde zu der Zeit auf der CPU laufen, aber das ist nicht relevant. Ein Multiprozessorsystem kann mehrere Prozesse gleichzeitig auf der CPU haben.
Vordergrund- und Hintergrundprozesse sind meistens ein Shell-Konstrukt, und es gibt auch keinen eindeutigen Vordergrundprozess, da alle Shell-Sitzungen auf dem System einen haben.
quelle
Die Formulierung hätte besser sein können, aber jede Formulierung, die Sie versuchen, um die Idee der Selbstreferenz auszudrücken, wird verwirrend sein. Der Name des Verzeichnisses ist meiner Meinung nach aussagekräftiger.
Stellt im Grunde
/proc/self/
den Prozess dar, der liest/proc/self/
. Wenn Sie also versuchen,/proc/self/
ein C-Programm zu öffnen , repräsentiert es dieses Programm. Wenn Sie versuchen, es von der Shell aus zu tun, dann ist es die Shell usw.Aber was ist, wenn Sie eine Quad-Core-CPU haben, die in der Lage ist, 4 Prozesse gleichzeitig auszuführen, also kein Multitasking?
Dann wird jeder Prozess einen anderen sehen,
/proc/self/
ohne dass man sich gegenseitig sehen kann/proc/self/
.Wie funktioniert das?
Naja,
/proc/self/
ist eigentlich kein Ordner. Es ist ein Gerätetreiber, der sich zufällig als Ordner ausgibt, wenn Sie versuchen, darauf zuzugreifen. Dies liegt daran, dass die für Ordner erforderliche API implementiert wird. Das/proc/self/
Verzeichnis ist nicht das einzige, das dies tut. Ziehen Sie freigegebene Ordner in Betracht, die von Remoteservern bereitgestellt wurden, oder aktivieren Sie USB-Sticks oder Dropbox. Sie alle implementieren dieselben APIs, mit denen sie sich wie Ordner verhalten.Wenn ein Prozess versucht, auf
/proc/self/
den Gerätetreiber zuzugreifen , werden seine Inhalte dynamisch generiert, indem Daten aus diesem Prozess gelesen werden. Die Dateien in existieren/proc/self/
also nicht wirklich. Es ist wie ein Spiegel, der den Prozess reflektiert, der versucht, ihn zu betrachten.Ist es wirklich ein Gerätetreiber? Du hörst dich an, als ob du Dinge zu stark vereinfachst!
Ja, das ist es wirklich. Wenn Sie pedantisch sein wollen, ist es ein Kernel-Modul. Wenn Sie jedoch Usenet-Posts auf den verschiedenen Linux-Entwicklerkanälen lesen, verwenden die meisten Kernel-Entwickler "Gerätetreiber" und "Kernel-Modul" austauschbar. Früher habe ich Gerätetreiber, fehlerhafte Kernelmodule für Linux geschrieben. Wenn Sie eine eigene Benutzeroberfläche erstellen möchten,
/proc/
beispielsweise ein/proc/unix.stackexchange/
Dateisystem, das Beiträge von dieser Website zurückgibt, können Sie in dem von O'Reilly veröffentlichten Buch "Linux Device Drivers" nachlesen, wie dies funktioniert. Es ist sogar als Softcopy online verfügbar.quelle
/proc/self
ist kein Gerätetreiber, sondern Teil eines kernelexponierten Dateisystemsprocfs
./proc
basierten Treibers im ehrwürdigen Buch "Linux Device Drivers". Ich sollte wissen, ich habe eine im College implementiert. Ich hätte wahrscheinlich stattdessen den Begriff "Kernelmodul" verwenden können, aber "Gerätetreiber" ist das, was die meisten Leute kennen, und ich möchte nicht den irreführenden Eindruck erwecken, dass es einen signifikanten Unterschied zwischen "Kernelmodul" und "Gerätetreiber" gibt. abgesehen von der Terminologie.Es ist der Prozess, auf den zugegriffen wird,
/proc/self
oder die darin enthaltenen Dateien / Ordner.Versuchen Sie es
cat /proc/self/cmdline
. Überraschenderweise erhalten Siecat /proc/self/cmdline
(tatsächlich wird anstelle eines Leerzeichens ein Nullzeichen zwischen demt
und dem/
angezeigt), da dies der Cat-Prozess ist, der auf dieses Pseudofile zugreift.Wenn Sie eine
ls -l /proc/self
ausführen, wird die PID des ls-Prozesses selbst angezeigt. Oder wie wäre esls -l /proc/self/exe
; es wird auf die ausführbare Datei von ls verweisen.Oder probieren Sie dies zur Abwechslung:
oder auch
Wie gesagt, es ist der Prozess, auf den zugegriffen wird,
/proc/self
oder die darin enthaltenen Dateien / Ordner.quelle
/ proc / self ist syntaktischer Zucker. Es ist eine Verknüpfung zur Verkettung von / proc / und dem Ergebnis des Systemaufrufs getpid () (in bash als Metavariable $$ verfügbar). Es kann verwirrend werden, wenn bei Shell-Skripten viele der Anweisungen andere Prozesse aufrufen, einschließlich der eigenen PIDs ... PIDs, die häufig auf tote Prozesse verweisen. Erwägen:
'/ bin / ls' wertet den Pfad zum Verzeichnis aus und löst ihn als / proc / 26563 auf, da dies die PID des Prozesses ist - der neu erstellte Prozess / bin / ls -, der den Inhalt des Verzeichnisses liest. Bis zum nächsten Prozess in der Pipeline, im Fall von Shell-Skripten oder zum Zeitpunkt der Rückkehr der Eingabeaufforderung, im Fall einer interaktiven Shell, ist der Pfad jedoch nicht mehr vorhanden und die Informationsausgabe bezieht sich auf einen nicht vorhandenen Prozess.
Dies gilt jedoch nur für externe Befehle (dh ausführbare Programmdateien, die nicht in die Shell selbst integriert sind). Sie erhalten also andere Ergebnisse, wenn Sie beispielsweise Dateinamen-Globbing verwenden, um eine Liste des Inhalts des Verzeichnisses zu erhalten, anstatt den Pfadnamen an den externen Prozess / bin / ls zu übergeben:
In der ersten Zeile hat die Shell über exec () syscall einen neuen Prozess '/ bin / ls' erzeugt, wobei "/ proc / self / fd" als argv [1] übergeben wurde. '/ bin / ls' öffnete seinerseits das Verzeichnis / proc / self / fd und las dessen Inhalt, dann druckte er ihn aus, während er darüber iterierte.
In der zweiten Zeile wird jedoch glob () hinter den Kulissen verwendet, um die Liste der Dateinamen zu erweitern. Diese werden als Array von Zeichenfolgen zum Echo übergeben. (Wird normalerweise als interner Befehl implementiert, aber es gibt oft auch einen / bin / echo-Binärbefehl ... aber dieser Teil ist eigentlich irrelevant, da sich echo nur mit Strings befasst und niemals mit einem Systemaufruf in Verbindung mit Pfadnamen verbunden ist.)
Betrachten Sie nun den folgenden Fall:
Hier hat die Shell, der übergeordnete Prozess von / bin / ls, ein Unterverzeichnis von / proc / self zu ihrem aktuellen Verzeichnis gemacht . Somit werden relative Pfadnamen aus ihrer Perspektive ausgewertet. Ich vermute, dass dies mit der POSIX-Dateisemantik zusammenhängt, bei der Sie mehrere feste Links zu einer Datei erstellen können, einschließlich aller geöffneten Dateideskriptoren. Diesmal verhält sich / bin / ls also ähnlich wie echo / proc / $$ / fd / *.
quelle
Wenn die Shell Programme wie ls in separaten Prozessen aufruft, wird / proc / self als Symlink zu nnnnn angezeigt , wobei nnnnn die Prozess-ID des ls-Prozesses ist. Soweit ich weiß, sind häufig verwendete Shells nicht zum Lesen von Symlinks integriert, aber Perl hat:
perl -e 'print "/ proc / self link:", readlink ("/ proc / self"), "- pid $$ \ n";'
/ Proc / self verhält sich also wie ein Symlink, aber das procfs-Dateisystem macht es "magisch" prozessbewusst.
quelle