Was bedeutet es, dass jeder Prozess ein aktuelles Verzeichnis hat?

Was bedeutet es, dass jeder Prozess ein aktuelles Verzeichnis hat?

Ich lese "The Unix Programming Environment", aber ich verstehe das Konzept nichtAktuelles Verzeichnisdes Prozesses.

Jeder Prozess hat eineAktuelles Verzeichnis, und es wird implizit angenommen, dass alle Dateinamen mit dem Namen dieses Verzeichnisses beginnen, sofern sie nicht direkt mit einem Schrägstrich beginnen.

Bedeutet das, dass jeder Prozess ein Zeichen dafür hat, in welchem ​​Verzeichnis er erstellt wurde? Wenn beispielsweise ein Programm /bin/sedvon aufgerufen wurde /home/rene, hat der Prozess, der durch den Aufruf von sed erstellt wurde, das aktuelle Verzeichnis /home/rene?

Antwort1

Konzeptionelle Ebene

Wenn Sie einen Prozess von Ihrer Shell aus starten, ist das aktuelle Arbeitsverzeichnis des Prozesses dasselbe wie das aktuelle Arbeitsverzeichnis Ihrer Shell. Im Kontext der Shell ist das aktuelle Arbeitsverzeichnis der Ort, an dem Sie sich gerade befinden.

Das aktuelle Arbeitsverzeichnis eines Prozesses wird zum Interpretieren relativer Pfade verwendet. Wenn das aktuelle Arbeitsverzeichnis Ihrer Shell beispielsweise lautete /home/reneund Sie von der Shell aus ausgeführt haben , wird ls ..das aktuelle Arbeitsverzeichnis des Prozesses, , zum Auflösen in verwendet ./home/rene../home

Sie können die aktuellen Arbeitsverzeichnisse aller Prozesse sehen, die auf Ihrem System laufen. lsof | grep '\scwd\s'(Beachten Sie, dass Sie wahrscheinlich Root-Benutzer sein müssen, um die Prozesse anderer Benutzer sehen zu können.) So erhalten Sie eine Vorstellung davon, in welcher Beziehung die aktuellen Arbeitsverzeichnisse zu den Prozessen stehen, die auf Ihrem System laufen.

Programmebene

Das aktuelle Arbeitsverzeichnis der Shell ist das Verzeichnis, das Sie mit den integrierten Shell-Funktionen pwdbzw. sehen und ändern können cd. Diese Befehle rufen Systemaufrufe wie getcwdund auf chdir, die mit dem aktuellen Arbeitsverzeichnis Ihrer Shell funktionieren.

bashAm Beispiel eines integrierten cdProgramms wird schließlich diese Zeile ausgeführt:

if (chdir (nolinks ? newdir : tdir) == 0)

und das pwdintegrierte Programm führt schließlich diese Zeile aus:

the_current_working_directory = getcwd (0, PATH_MAX);

Die Shell ist nur ein praktisches Beispiel für die Verwendung des aktuellen Arbeitsverzeichnisses; dieselben Systemaufrufe werden auch von anderen Programmen verwendet. Ein Programm kann sein aktuelles Arbeitsverzeichnis ändern /usrund alle relativen Pfade, die das Programm verwendet, beginnen in diesem /usrVerzeichnis.

Kernel-Ebene

Das aktuelle Arbeitsverzeichnis eines Prozesses wird vom Kernel gespeichert. Linux speichert es im pwdMember von , auf das das Member von fs_structzeigt . Das Member ist eine Struktur, die auf Informationen über die Einbindung ( ) und den Speicherort des Verzeichnisses im Dateisystem ( ) zeigt. Jeder Prozess hat ein zugeordnetes .fstask_structpwdpathvfsmountdentrytask_struct

Die Systemaufrufe und ändern und rufen Informationen in chdirab .getcwdpwd

Antwort2

Jeder Prozess hat ein aktuelles Arbeitsverzeichnis (CWD), das ihm beim Start zugewiesen wird. Um das Arbeitsverzeichnis eines Prozesses herauszufinden, können Sie Folgendes tun.

Führen Sie ps aux aus, um die PID eines Prozesses herauszufinden:

$ pgrep cupsd
24532

So ermitteln Sie das aktuelle Arbeitsverzeichnis einer PID: 24532

$ sudo pwdx 24532
24532: /

Der Prozess (PID: 24532) hat also eine CWD von /.

Hier ist ein weiteres Beispiel:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

Dieses Mal ist der CWD des Sleep-Prozesses (PID: 15988) auf mein Home-Verzeichnis eingestellt /home/sam.

Sie können auch den ls -lfolgenden Befehl ausführen:

$ sudo ls -l /proc/24532/cwd
lrwxrwxrwx 1 root root 0 Apr 30 19:18 /proc/24532/cwd -> /

-oder-

$ ls -l /proc/15988/cwd
lrwxrwxrwx 1 sam sam 0 Apr 30 19:23 /proc/15988/cwd -> /home/sam

Hier können Sie noch einmal die CWD für diese Prozesse sehen, /und /home/sam.

Verweise

verwandte Informationen