Co to znaczy, że każdy proces ma bieżący katalog?

10

Czytam „The Unix Programming Environment”, ale nie rozumiem pojęcia bieżącego katalogu procesów.

Każdy proces ma bieżący katalog i zakłada się, że wszystkie nazwy plików rozpoczynają się od nazwy tego katalogu, chyba że zaczynają się bezpośrednio od ukośnika.

Czy to oznacza, że ​​każdy proces ma znak, w którym katalogu został utworzony? Na przykład, jeśli program /bin/sedzostał wywołany /home/rene, to proces utworzony z wywołania sed ma bieżący katalog /home/rene?

Rene Ott
źródło

Odpowiedzi:

13

Poziom koncepcyjny

Po uruchomieniu procesu z powłoki bieżący katalog roboczy procesu jest taki sam, jak bieżący katalog roboczy powłoki. W kontekście powłoki bieżącym katalogiem roboczym jest lokalizacja, w której aktualnie „znajdujesz się”.

Bieżący katalog roboczy dowolnego procesu służy do interpretacji ścieżek względnych. Na przykład, jeśli bieżący katalog roboczy twoja powłoka była /home/renei pobiegł ls ..z powłoki, bieżący katalog roboczy procesu, w /home/rene, byłyby wykorzystywane do zdecydowania ..się /home.

Możesz zobaczyć bieżące działające katalogi wszystkich procesów uruchomionych w twoim systemie lsof | grep '\scwd\s'(pamiętaj, że prawdopodobnie będziesz musiał być rootem, aby zobaczyć procesy innych użytkowników). To może dać ci wyobrażenie o tym, jak bieżące działające katalogi odnoszą się do procesy uruchomione w twoim systemie.

Poziom programu

Bieżący katalog roboczy powłoki jest katalog można zobaczyć i modyfikować z wbudowanym poleceniem powłoki ins pwdi cdodpowiednio. Te polecenia wywołują wywołania systemowe, takie jak getcwdi, chdirktóre działają z bieżącym katalogiem roboczym powłoki.

Używając bashjako przykładu, cdwbudowane ostatecznie uruchamia tę linię:

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

a pwdwbudowane ostatecznie uruchamia tę linię:

the_current_working_directory = getcwd (0, PATH_MAX);

Powłoka jest tylko wygodnym przykładem użycia bieżącego katalogu roboczego; te same wywołania systemowe są również używane przez inne programy. Program może zmienić swój bieżący katalog roboczy na, /usra wszelkie ścieżki względne, których używa program, zaczną się od /usrkatalogu,

Poziom jądra

Bieżący katalog roboczy procesu jest przechowywany przez jądro. Linux przechowuje go w pwdelemencie fs_structwskazanym przez fsczłonka task_struct. Element pwdczłonkowski jest pathstrukturą, która wskazuje na informacje o mount ( vfsmount) i lokalizacji katalogu w systemie plików ( dentry). Każdy proces jest task_structz nim powiązany.

Te chdiri getcwdwywołań systemowych modyfikacji i pobierać informacje pwd.


źródło
Dodatkowo, na poziomie jądra warto pamiętać, że gdy wykonywane jest wywołanie systemowe, dostępny jest wskaźnik do „bieżącego” zadania_struktury - więc kod jest wykonywany „w imieniu” bieżącego procesu. fs_struct można uzyskać za pomocą wskaźnika do bieżącego zadania_struct
Dmitrii S.
1

Każdy proces ma bieżący katalog roboczy (CWD), do którego jest przypisany podczas uruchamiania. Możesz wykonać następujące czynności, aby znaleźć katalog roboczy dla procesu.

Uruchom ps aux, aby znaleźć PID procesu:

$ pgrep cupsd
24532

Aby znaleźć bieżący katalog roboczy PID: 24532

$ sudo pwdx 24532
24532: /

Tak więc proces (PID: 24532) ma CWD o wartości /.

Oto inny przykład:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

Tym razem proces snu (PID: 15988) ma swój zestaw CWD do mojego katalogu domowego /home/sam.

Możesz także uruchomić ls -lpolecenie:

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

-lub-

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

Tutaj możesz ponownie zobaczyć CWD dla tych procesów /oraz /home/sam.

Bibliografia

slm
źródło