Что это значит, что каждый процесс имеет текущий каталог?

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.


источник
Кроме того, для уровня ядра полезно помнить, что при выполнении системного вызова имеется указатель на «текущую» структуру_задачи - поэтому код выполняется «от имени» текущего процесса. Доступ к 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.

Ссылки

SLM
источник