4

Когда программа обращается к файлам, использует system() и т. Д., Как и где текущий рабочий каталог этой программы физически известен/хранится? Поскольку логически рабочий каталог программы похож на глобальную переменную, он должен идеально быть поточно-локальным, особенно в таких языках, как D, где по умолчанию глобальные переменные являются потоковыми. Можно ли сделать текущую рабочую директорию программной нить-локальной?Как/где хранится рабочий каталог программы?

Примечание: Если вы не знакомы с D конкретно, может быть полезным даже ответ на язык-агностик.

ответ

7

Текущий каталог поддерживается ОС, а не языком или каркасом. См. description of GetCurrentDirectory WinAPI function.

Из описания:

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

+3

+1: Также ОС не требуется, чтобы * иметь * текущий каталог. Или даже есть каталоги вообще. «Файловая система» может быть ключом/значением DB, который позволяет вам вводить двоеточия, косые черты и обратные слэши в клавишах только для удовольствия, но на самом деле не заботится. –

7

В Linux каждый процесс представлен дескриптором процесса - a task_struct. Эта структура определена в include/linux/sched.h в источнике ядра.

Одно из полей task_struct является указателем на fs_struct, в котором хранится информация, связанная с файловой системой. fs_struct определяется в include/linux/fs_struct.h.

fs_struct имеет поле pwd, в котором хранится информация о текущем рабочем каталоге (файловая система, в которой она включена, и сведения о самой директории).