Що означає, що кожен процес має поточний каталог?


10

Я читаю "Середовище програмування Unix", але не розумію поточного каталогу концепції .

Кожен процес має поточний каталог , і всі ім’я файлів неявно передбачається починати з імені цього каталогу, якщо тільки вони не починаються безпосередньо з косою рисою.

Чи означає це, що кожен процес має знак, в якому каталозі він створений? Наприклад, якщо програма /bin/sedбула викликана /home/rene, то процес, який був створений з виклику sed, має поточний каталог /home/rene?

Відповіді:


13

Концептуальний рівень

Коли ви запускаєте процес із своєї оболонки, поточний робочий каталог процесу такий же, як і поточний робочий каталог вашої оболонки. У контексті оболонки поточний робочий каталог - це місце, де ви зараз перебуваєте.

Поточний робочий каталог будь-якого процесу використовується для інтерпретації відносних шляхів. Наприклад, якщо поточний робочий каталог вашої оболонки був , /home/reneі ви побігли ls ..від раковини, поточний робочий каталог процесу, в /home/rene, буде використовуватися для вирішення ..на /home.

Ви можете побачити поточні робочі каталоги всіх процесів, що працюють у вашій системі lsof | grep '\scwd\s'(зауважте, що вам, ймовірно, потрібно буде мати root, щоб побачити процеси інших користувачів.) Це може дати вам уявлення про те, як поточні робочі каталоги відносяться до процеси, що працюють у вашій системі.

Програмний рівень

Поточний робочий каталог оболонки - це каталог, який ви бачите та змінюєте за допомогою вбудованих оболонок pwdі cdвідповідно. Ці команди викликають системні виклики, такі як getcwdі chdirякі працюють з поточним робочим каталогом вашої оболонки.

Використовуючи bashяк приклад, cdвбудований зрештою запускає цей рядок:

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

і pwdвбудований зрештою запускає цю лінію:

the_current_working_directory = getcwd (0, PATH_MAX);

Оболонка - лише зручний приклад використання поточного робочого каталогу; ці ж системні дзвінки використовуються і іншими програмами. Програма може змінити поточний робочий каталог на /usrбудь-який відносний шлях, який програма використовує, починається з /usrкаталогу,

Рівень ядра

Поточний робочий каталог процесу зберігається ядром. Linux зберігає його в pwdчлені, на який fs_structвказав fsчлен a task_struct. pwdЕлемент є pathструктура, яка вказує на інформацію про горе ( vfsmount) і каталог , де в файлової системі ( dentry). Кожен процес task_structпов'язаний з ним.

В chdirі getcwdсистемні виклики змінювати і отримувати інформацію pwd.


Крім того, для рівня ядра корисно пам’ятати, що при здійсненні системного виклику є вказівник на «поточний» task_struct, доступний - тому код виконується «від імені» поточного процесу. fs_struct можна отримати через вказівник на поточну task_struct: elixir.free-electrons.com/linux/v4.12.4/source/fs/…
С.

1

Кожен процес має поточний робочий каталог (CWD), якому він призначається при запуску. Ви можете зробити наступне, щоб дізнатися робочий каталог для процесу.

Запустіть ps aux, щоб дізнатись PID процесу:

$ pgrep cupsd
24532

Щоб дізнатися поточний робочий каталог PID: 24532

$ sudo pwdx 24532
24532: /

Отже, процес (PID: 24532) має CWD /.

Ось ще один приклад:

$ sleep 1000 &
[1] 15988

$ pwdx 15988
15988: /home/sam

На цей раз процес сну (PID: 15988) має це вухо набір в мій домашній каталог /home/sam.

Ви також можете виконати ls -lкоманду:

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

або

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

Тут ви знову можете побачити CWD для цих процесів /та /home/sam.

Список літератури

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.