Es ist wichtig zu verstehen, dass jeder Prozess seine eigenen Umgebungsvariablen hat.
Wenn ein Prozess ruft den fork()
Systemaufruf, einen zweiten Prozess (das Kind ) identisch mit der ersten ( der Mutter ) erstellt (diese Kopie die Umgebung umfasst, die knapp über dem Stapel befindet (oder knapp darunter, je nachdem , wie Sie von Stapeln denken :-)
- aber in unix / linux wächst der stack runter von hohen Adressen ab.
Normalerweise ruft der untergeordnete Prozess dann den execve()
Systemaufruf auf, der alles in seinem (virtuellen) Speicher verwirft und rekonstruiert aus den Code- und Datenabschnitten in der angegebenen Binärdatei .
Bei der Rekonstruktion des Stapels werden jedoch die execve()
an den Stapel übergebenen Umgebungs- und Argumentzeichenfolgen zuerst (in dieser Reihenfolge) kopiert , bevor die main()
Funktion aufgerufen wird (ein Großteil der Arbeit wird im crt0
Bootstrap-Code nach der execve()
Rückkehr (zum Eintrag) erledigt Punkt in der Binär)) angegeben.
Es gibt Wrapper für den execve()
Systemaufruf in der C-Bibliothek, die die aktuelle Umgebung (dh eine Kopie der übergeordneten Umgebung) übergeben, anstatt dass der Aufrufer sie bereitstellt (so dass das Kind in der Tat die übergeordnete Umgebung erbt ) - sieheenviron(7)
.
Versuchen Sie, den Befehl (als root) auszuführen ps axeww | less
. Dies zeigt Ihnen die Umgebung für alle Prozesse! Ein interessanter Prozess ist Prozess-ID 1 (dh der init
Prozess - der erste Prozess, der vom Kernel beim Booten erstellt wird).
Wenn Sie die Umgebung nach einem bestimmten Prozess durchsuchen möchten (und wissen, dass es sich um eine Prozess-ID handelt), führen Sie den Befehl aus cat /proc/<PID>/environ
(ersetzen)<PID>
durch die Prozess-ID).
Beachten Sie, dass ein Prozess, der über genügend Berechtigungen verfügt, seinen eigenen Stapel neu schreiben kann, wodurch es schwierig wird, die Umgebung zu kennen. In der Ausgabe von ps werden einige Dämonprozesse wie diese angezeigt.
Aber am Ende läuft diese ganze Waffel auf das hinaus, was @chaos oben gesagt hat. Wenn Sie den aktuellen Wert einer bestimmten Umgebungsvariablen in Ihrem Shell-Prozess anzeigen möchten, verwenden Sie einfach den Befehl echo "$<NAME>"
( builtin) (durch <NAME>
den Namen des Befehls ersetzen ) Umgebungsvariable, an der Sie interessiert sind) ... beachten Sie nur, dass dieselbe Variable in einem anderen Prozess möglicherweise einen anderen Wert hat oder überhaupt nicht existiert.
echo
ist eine schlechte Wahl eines Befehls, da er den Inhalt der Variablen transformieren könnte. Der Inhalt des Shell-Parameters wird mit demselben Namen ausgegeben. Das ist nicht unbedingt das gleiche , wenn die Bourne - Shell oder für env mit vars wie1
,*
zum Beispiel. Und Sie können diesen Ansatz nicht für Umgebungsvariablen verwenden, deren Name nicht als Shell-Variablenname gültig ist.