Я читаю «Среду программирования 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
.