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

10

Ich lese "Die Unix-Programmierumgebung", verstehe aber das aktuelle Prozessverzeichnis des Konzepts nicht .

Jeder Prozess hat ein aktuelles Verzeichnis , und es wird implizit angenommen, dass alle Dateinamen mit dem Namen dieses Verzeichnisses beginnen, es sei denn, sie beginnen direkt mit einem Schrägstrich.

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

Rene Ott
quelle

Antworten:

13

Konzeptionelle Ebene

Wenn Sie einen Prozess von Ihrer Shell aus starten, entspricht das aktuelle Arbeitsverzeichnis des Prozesses dem aktuellen Arbeitsverzeichnis Ihrer Shell. Im Kontext der Shell ist das aktuelle Arbeitsverzeichnis der Speicherort, an dem Sie sich derzeit befinden.

Das aktuelle Arbeitsverzeichnis eines Prozesses wird verwendet, um relative Pfade zu interpretieren. Wenn beispielsweise das aktuelle Arbeitsverzeichnis Ihrer Shell war /home/reneund Sie ls ..von der Shell ausgeführt wurden, wird das aktuelle Arbeitsverzeichnis des Prozesses /home/renezum Auflösen ..in verwendet /home.

Sie können die aktuellen Arbeitsverzeichnisse aller auf Ihrem System ausgeführten Prozesse mit anzeigen lsof | grep '\scwd\s'(beachten Sie, dass Sie wahrscheinlich root sein müssen, um die Prozesse anderer Benutzer zu sehen.) Dies kann Ihnen eine Vorstellung davon geben, wie sich aktuelle Arbeitsverzeichnisse auf die beziehen Prozesse, die auf Ihrem System ausgeführt werden.

Programmebene

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

Am bashBeispiel führt das cdintegrierte Gerät schließlich diese Zeile aus:

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

und das pwdeingebaute führt schließlich diese Linie 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 in ändern, /usrund alle relativen Pfade, die das Programm verwendet, beginnen im /usrVerzeichnis.

Kernel-Ebene

Das aktuelle Arbeitsverzeichnis eines Prozesses wird vom Kernel gespeichert. Linux speichert es in dem pwdMitglied eines, fs_structauf das das fsMitglied eines zeigt task_struct. Das pwdMitglied ist eine pathStruktur, die auf Informationen über mount ( vfsmount) und den Speicherort des Verzeichnisses im Dateisystem ( dentry) verweist . Jedem Prozess ist ein Prozess task_structzugeordnet.

Die chdirund getcwdSystemaufrufe ändern und Abrufen von Informationen in pwd.


quelle
Darüber hinaus ist es für die Kernel-Ebene hilfreich, sich daran zu erinnern, dass beim Ausführen eines Systemaufrufs ein Zeiger auf das 'aktuelle' task_struct verfügbar ist, sodass der Code 'im Auftrag' des 'aktuellen Prozesses' ausgeführt wird. Auf fs_struct kann über den Zeiger auf das aktuelle task_struct zugegriffen werden: elixir.free-electrons.com/linux/v4.12.4/source/fs/…
Dmitrii S.
1

Jeder Prozess verfügt über ein aktuelles Arbeitsverzeichnis (CWD), dem es beim Start zugewiesen wird. Sie können Folgendes tun, um das Arbeitsverzeichnis für einen Prozess zu ermitteln.

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

$ 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

Diesmal ist für den Schlafprozess (PID: 15988) CWD auf mein Ausgangsverzeichnis eingestellt /home/sam.

Sie können auch den folgenden ls -lBefehl 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 sehen Sie wieder die CWD für diese Prozesse /und /home/sam.

Verweise

slm
quelle