Что именно принадлежит «текущему рабочему каталогу»? - PullRequest
5 голосов
/ 31 января 2012

Я знаю, что такое рабочий каталог (wd) и его назначение (по крайней мере, для написания программного обеспечения).

Что я не понимаю, так это право собственности на wd. Кроме того, я хочу понять, как ответ может отличаться в разных операционных системах, поэтому любые разъяснения по поводу необычного поведения в конкретной ОС приветствуются.

Итак, во-первых, где проявляется wd? Это внутри процесса, и все потоки, созданные этим процессом, имеют один и тот же wd? Если wd модифицируется потоком 'A', будет ли изменение сразу видно для потока 'B', который также был создан процессом 'A' потока?

А во-вторых, как изначально определяется wd? Если вы запускаете что-то из командной строки, его довольно легко увидеть как, но как насчет процесса, который порождает еще несколько процессов?


Примечание: Process Explorer показывает каждый процесс 'wd в своем окне свойств.

Ответы [ 2 ]

4 голосов
/ 31 января 2012

В большинстве современных операционных систем рабочий каталог является свойством процесса.Когда родительский процесс разветвляет дочерний процесс, он будет (по умолчанию) иметь тот же рабочий каталог.Это поведение обычно можно переопределить, явно указав рабочий каталог.

После разветвления поле рабочего каталога дочернего элемента не зависит от родительского.Изменение рабочего каталога родителя не должно изменять дочерний процесс.Поведение дублирования любых дескрипторов или маркеров безопасности, связанных с рабочим каталогом, сильно зависит от операционной системы.

В Windows CreateProcess добавляет структуру RTL_USER_PROCESS_PARAMETERS в памятьпроцесс, который содержит UNICODE_STRING CurrentDirectoryPath и HANDLE CurrentDirectoryHandle.Структура всегда загружается в 0x20000 в существующих версиях Windows NT, но это может измениться в будущем.

3 голосов
/ 31 января 2012
  1. Как правило, текущий рабочий каталог представляет собой конструкцию для каждого процесса, поэтому все потоки внутри процесса совместно используют один PWD, а chdir мгновенно распространяется на другие потоки.(В Linux можно создавать потоки с собственным PWD с помощью системного вызова низкого уровня clone.)

  2. PWD наследуется отродитель процесса.Сколько процессов в брате или сестре не имеет значения;они все будут делиться своим первоначальным PWD.

...