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/sed
von 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/rene
und 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 pwd
bzw. sehen und ändern können cd
. Diese Befehle rufen Systemaufrufe wie getcwd
und auf chdir
, die mit dem aktuellen Arbeitsverzeichnis Ihrer Shell funktionieren.
bash
Am Beispiel eines integrierten cd
Programms wird schließlich diese Zeile ausgeführt:
if (chdir (nolinks ? newdir : tdir) == 0)
und das pwd
integrierte 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 /usr
und alle relativen Pfade, die das Programm verwendet, beginnen in diesem /usr
Verzeichnis.
Kernel-Ebene
Das aktuelle Arbeitsverzeichnis eines Prozesses wird vom Kernel gespeichert. Linux speichert es im pwd
Member von , auf das das Member von fs_struct
zeigt . Das Member ist eine Struktur, die auf Informationen über die Einbindung ( ) und den Speicherort des Verzeichnisses im Dateisystem ( ) zeigt. Jeder Prozess hat ein zugeordnetes .fs
task_struct
pwd
path
vfsmount
dentry
task_struct
Die Systemaufrufe und ändern und rufen Informationen in chdir
ab .getcwd
pwd
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 -l
folgenden 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
.