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

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

Я читаю «Среду программирования Unix», но не понимаю концепцию.Текущий каталогпроцесса.

Каждый процесс имеетТекущий каталог, и все имена файлов неявно предполагаются начинающимися с имени этого каталога, если только они не начинаются непосредственно со слеша.

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

решение1

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

Когда вы запускаете процесс из вашей оболочки, текущий рабочий каталог процесса совпадает с текущим рабочим каталогом вашей оболочки. В контексте оболочки текущий рабочий каталог — это место, где вы в данный момент находитесь.

Текущий рабочий каталог любого процесса используется для интерпретации относительных путей. Например, если текущий рабочий каталог вашей оболочки был /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член task_struct. pwdЧлен — это pathструктура, которая указывает на информацию о монтировании ( vfsmount) и расположении каталога в файловой системе ( dentry). task_structС каждым процессом связан .

Системные вызовы chdirи getcwdизменяют и извлекают информацию в pwd.

решение2

У каждого процесса есть текущий рабочий каталог (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

На этот раз CWD процесса сна (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.

Рекомендации

Связанный контент