Einführung in Linux-Umgebungsvariablen und Prozessadressraum

Einführung in Linux-Umgebungsvariablen und Prozessadressraum

Linux-Umgebungsvariablen und Prozessadressraum

//Prozess-PID und übergeordneten Prozess anzeigen [dy@VM-12-10-centos jincheng_12_5]$ ps ajx | head -1 && ps axj | grep 3669470
   PPID PID PGID SID TTY TPGID STAT UID ZEIT BEFEHL
3669469 3669470 3669470 3669439 Punkte/0 3681645 S 1001 0:00 -bash
3669470 3681645 3681645 3669439 Punkte/0 3681645 R+ 1001 0:00 ps axj
3669470 3681646 3681645 3669439 Punkte/0 3681645 R+ 1001 0:00 grep --color=auto 3669470


//Die erste Methode zum Ausführen des Programms ohne Hinzufügen eines Pfads [dy@VM-12-10-centos jincheng_12_5]$ ll
insgesamt 28
-rw-rw-r-- 1 Tag Tag 73 5. Dez. 16:46 Makefile
-rwxrwxr-x 1 Tag Tag 17432 5. Dez. 16:47 proc
-rw-rw-r-- 1 Tag Tag 75 5. Dez. 16:47 proc.c
[dy@VM-12-10-centos jincheng_12_5]$ sudo cp proc /usr/bin/                  
//Eigenes ausführbares Programm zum Systempfad hinzufügen [sudo] Passwort für dy: 
[dy@VM-12-10-centos jincheng_12_5]$ proc //Fügen Sie dem Systempfad Ihr eigenes ausführbares Programm hinzu, und Sie müssen den Pfad ./ nicht hinzufügen. Hallo Welt!
[dy@VM-12-10-centos jincheng_12_5]$ ./proc
Hallo Welt!
[dy@VM-12-10-centos jincheng_12_5]$ sudo rm /usr/bin/proc //Aus dem Systempfad löschen [dy@VM-12-10-centos jincheng_12_5]$ proc
-bash: /usr/bin/proc: Keine solche Datei oder kein solches Verzeichnis

//Der zweite Typ [dy@VM-12-10-centos jincheng_12_5]$ $PATH
-bash: /home/dy/.local/bin:/home/dy/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin: Keine solche Datei oder kein solches Verzeichnis
[dy@VM-12-10-centos jincheng_12_5]$ pwd
/home/dy/jincheng_12_5
//Füge den aktuellen Pfad zur Umgebungsvariable PATH hinzu [dy@VM-12-10-centos jincheng_12_5]$ PATH=$PATH:/home/dy/jincheng_12_5
[dy@VM-12-10-centos jincheng_12_5]$ proc
Hallo Welt!

//Nur 3000 Befehle speichern [dy@VM-12-10-centos jincheng_12_5]$ echo $HISTSIZE
3000
//Zeigen, wie viele Befehle zuvor ausgeführt wurden [dy@VM-12-10-centos jincheng_12_5]$ history |wc -l
636
[dy@VM-12-10-centos jincheng_12_5]$ Verlauf
// Alle vorherigen Befehle auf dem Display ausgeben // Alle Umgebungsvariablen anzeigen [dy@VM-12-10-centos jincheng_12_5]$ env
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.m4a=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.oga=01;36:*.opus=01;36:*.spx=01;36:*.xspf=01;36:
LANG=en_US.utf8
HISTTIMEFORMAT=%F %T 
HOSTNAME=VM-12-10-centos
OLDPWD=/home/dy
USER=dy
PWD=/home/dy/jincheng_12_5
HOME=/Heimat/dy
MAIL=/var/spool/mail/dy
SHELL=/bin/bash
TERM=xterm
SHLVL=1
PROMPT_COMMAND=Verlauf -a; Verlauf -a; printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"
LOGNAME=dy
PATH=/home/dy/.local/bin:/home/dy/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dy/jincheng_12_5
HISTSIZE=3000
LESSOPEN=||/usr/bin/lesspipe.sh %s
_=/usr/bin/env


echo: Zeigt den Wert einer Umgebungsvariablen an

export: Neue Umgebungsvariable festlegen

[dy@VM-12-10-centos jincheng_12_5]$ ./proc //Lokale Variablen existieren nicht. Ich bin ein Proc: pid:3700079 ppid:3669470
Segmentierungsfehler (Core Dump)
[dy@VM-12-10-centos jincheng_12_5]$ export MY_VAL
[dy@VM-12-10-centos jincheng_12_5]$ ./proc
Ich bin ein Proc: pid:3700163 ppid:3669470
hallo dy
/home/dy/.local/bin:/home/dy/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dy/jincheng_12_5
/Startseite/dy
/bin/bash

env: Alle Umgebungsvariablen anzeigen

unset: Umgebungsvariablen löschen

Umgebungsvariable env

set: Lokal definierte Shell-Variablen und Umgebungsvariablen anzeigen

//Umgebungsvariablen festlegen [dy@VM-12-10-centos jincheng_12_5]$ hello=1234
//Denken Sie daran, $ zu den Ausgabeumgebungsvariablen hinzuzufügen [dy@VM-12-10-centos jincheng_12_5]$ echo $hello
1234
[dy@VM-12-10-centos jincheng_12_5]$ set | grep hallo
hallo=1234

Die meisten Befehle, die in der Befehlszeile ausgeführt werden, haben Bash als übergeordneten Prozess. Bash erstellt untergeordnete Prozesse, die Ihre Befehle ausführen.

Abrufen von Umgebungsvariablen über Code

#include <stdio.h>
#include<stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[], char *env[])
{
        for(int i = 0; argv[i]; ++i)//Kommandozeilenparameter interpretieren//for(int i = 0; i < argc; ++i)
        {
            printf("argv[%d]:%s\n",i,argv[i]);
        }
        for(int i = 0; env[i]; ++i) //Die Umgebungsvariable erhältst du über den Code {
           printf("Umgebung[%d]: %s\n",i,Umgebung[i]);
        }
   gebe 0 zurück;
}

[Bildübertragung über externen Link fehlgeschlagen. Die Quellseite verfügt möglicherweise über einen Anti-Hotlink-Mechanismus. Es wird empfohlen, das Bild zu speichern und direkt hochzuladen (img-7v2pxCt8-1639035758639)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211208141656121.png)]

int x = atoi(argv[2]);
argv[3]);
wenn (strcmp(argv[1],"-a") == 0)
{
    druckenf("%d + %d = %d\n",x,y,x+y);
}
anders
{
    drucken("%d - %d = %d\n",x,y,xy);
}

Bildbeschreibung hier einfügen

Jedes Programm erhält eine Umgebungstabelle, die ein Array von Zeichenzeigern ist, von denen jeder auf eine Umgebungszeichenfolge zeigt, die mit „\0“ endet.

Bildbeschreibung hier einfügen

Sie können die Umgebung auch über die Drittanbietervariable environ abrufen.

#include <stdio.h>
int main(int argc, char *argv[])
{
    externer Zeichen **Umgebung;
    }
    für(; Umgebung[i]; i++){
    	printf("%s\n", Umgebung[i]);
    }
	gebe 0 zurück;
}

Bildbeschreibung hier einfügen

Prozessadressraum

#include <stdio.h>
#include <unistd.h>
Gibt an, ob g_val 0 ist.
int main()
{
   pid_t id = fork();
   wenn(id < 0)
   {
       perror("fork() schlägt fehl\n");
   }
   sonst wenn (id == 0)
   {
       printf("Ich bin ein Kind:%d,%d,%p\n",getpid(),g_val,&g_val);
   }anders
   {
       printf("Ich bin ein Vater: %d, %d, %p\n",getppid(),g_val,&g_val);
   }
   gebe 0 zurück;
}

Bildbeschreibung hier einfügen

Aus den Ergebnissen des Laufs können wir erkennen, dass die Werte und Adressen der Variablen der beiden Prozesse gleich sind. Hier werden keine Änderungen am Code vorgenommen. Der Kindprozess verwendet den Elternprozess als Vorlage, daher sind die Adressen gleich.

Lassen Sie uns den Code leicht ändern

#include <stdio.h>
#include <unistd.h>
}
int main()
{
   pid_t id = fork();
   wenn(id < 0)
   {
       perror("fork() fehlgeschlagen");
   }
   sonst wenn (id == 0)
   {
       g_val = 100;
       printf("Ich bin ein Kind:%d,%d,%p\n",getpid(),g_val,&g_val);
   }anders
   {
       Schlaf (3);
       printf("Ich bin ein Vater: %d, %d, %p\n",getppid(),g_val,&g_val);
   }
   gebe 0 zurück;
}

Bildbeschreibung hier einfügen

An diesem Punkt stellen wir fest, dass sich der Wert der Variablen geändert hat, der übergeordnete Prozess ist 0, der untergeordnete Prozess ist 100, aber die Adresse der Variablen ist immer noch dieselbe.

Aus diesem Laufergebnis können wir die folgenden Punkte ableiten.

Die Werte der Variablen der beiden Prozesse sind unterschiedlich, sodass die Variablen der übergeordneten und untergeordneten Prozesse definitiv nicht denselben Variablenadresswert haben und definitiv nicht die physische Adresse! ! ! Alle Adressen, die wir sehen, sind virtuelle Adressen! ! ! Die echte physische Adresse ist für den Benutzer unsichtbar und wird vom Betriebssystem verwaltet (das Betriebssystem ist für die Konvertierung der virtuellen Adresse in die physische Adresse verantwortlich). Der Code wird gemeinsam genutzt, aber jeder hat seine eigene private Kopie der Daten (Copy-on-Write).

Warum ist es eine virtuelle Adresse und keine physische Adresse?

Was ist Prozessadressraum?

Prozessadressraum: Dies ist eine Art, den Speicher zu betrachten, ein abstraktes Konzept, Kernelstruktur mm-Struktur, sodass jeder Prozess denkt, er habe exklusive Systemspeicherressourcen (Sie denken, das Eigentum Ihres Vaters gehört nur Ihnen). Regionsaufteilung: Der Adressraum ist linear und nacheinander in eine Region unterteilt, [Start, Ende] Virtuelle Adresse: Jede Adresse zwischen [Start, Ende] wird als virtuelle Adresse bezeichnet

Bildbeschreibung hier einfügen

Eine Zuordnung von virtuellen Adressen zu physischen Adressen

Bildbeschreibung hier einfügen

Warum gibt es Prozessadressraum?

Schützen Sie den physischen Speicher und verhindern Sie den direkten Zugriff auf Adressen innerhalb eines Prozesses. So lässt sich die Legitimitätsprüfung einfacher gestalten. Entkoppeln Sie die Speicherverwaltung von der Prozessverwaltung, sodass jeder Prozess Code und Daten auf die gleiche Weise anzeigen kann.

[Bildübertragung über externen Link fehlgeschlagen. Die Quellseite verfügt möglicherweise über einen Anti-Hotlink-Mechanismus. Es wird empfohlen, das Bild zu speichern und direkt hochzuladen (img-wu0C4V57-1639035758649) (C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211209150456785.png)]

Von nun an können wir direkt zwischen Prozess und Programm unterscheiden.

Bildbeschreibung hier einfügen

Dies ist das Ende dieses Artikels über Linux-Umgebungsvariablen und Prozessadressraum. Weitere relevante Inhalte zu Linux-Umgebungsvariablen und Prozessraum finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • So konfigurieren Sie Umgebungsvariablen in einer Linux-Umgebung
  • Eine kurze Einführung in Linux-Umgebungsvariablendateien
  • Linux-Betrieb und -Wartung, grundlegendes Prozessmanagement, Echtzeitüberwachung und -steuerung

<<:  Wird CSS3 SCSS wirklich ersetzen?

>>:  Bootstrap 3.0-Lernunterlagen für Anfänger

Artikel empfehlen

Schritte zur Erstellung einer React Fiber-Struktur

Inhaltsverzeichnis React-Fasererstellung 1. Bevor...

So verwenden Sie JS WebSocket zur Implementierung eines einfachen Chats

Inhaltsverzeichnis Kurze Umfrage Langfristige Abf...

Die HTML-Eingabedateisteuerung begrenzt den Typ der hochgeladenen Dateien

Fügen Sie der Webseite ein HTML-Steuerelement für...

Detaillierte Erklärung verschiedener Join-Zusammenfassungen von SQL

SQL Left Join, Right Join, Inner Join und Natural...

JavaScript zum Implementieren einer einfachen Uhr

In diesem Artikelbeispiel wird der spezifische Co...

Erklärung zur Verwendung von JavaScript ECharts

Ich habe ECharts schon einmal bei einem Projekt v...