5.9 СМЕНА ТЕКУЩЕГО И КОРНЕВОГО КАТАЛОГА
5.9 СМЕНА ТЕКУЩЕГО И КОРНЕВОГО КАТАЛОГА
Когда система загружается впервые, нулевой процесс делает корневой каталог файловой системы текущим на время инициализации. Для индекса корневого каталога нулевой процесс выполняет алгоритм iget, сохраняет этот индекс в пространстве процесса в качестве индекса текущего каталога и снимает с индекса блокировку. Когда с помощью функции fork создается новый процесс, он наследует текущий каталог старого процесса в своем адресном пространстве, а ядро, соответственно, увеличивает значение счетчика ссылок в индексе.
алгоритм смены каталога
входная информация: имя нового каталога
выходная информация: отсутствует
{
получить индекс для каталога с новым именем (алгоритм namei);
if (индекс не является индексом каталога или же процессу не разрешен доступ к файлу) {
освободить индекс (алгоритм iput);
return (ошибку);
}
снять блокировку с индекса;
освободить индекс прежнего текущего каталога (алгоритм iput);
поместить новый индекс в позицию для текущего каталога в пространстве процесса;
}
Рисунок 5.14. Алгоритм смены текущего каталога
Алгоритм chdir (Рисунок 5.14) изменяет имя текущего каталога для процесса. Синтаксис вызова системной функции chdir:
chdir(pathname);
где pathname — каталог, который становится текущим для процесса. Ядро анализирует имя каталога, используя алгоритм namei, и проверяет, является ли данный файл каталогом и имеет ли владелец процесса право доступа к каталога. Ядро снимает с нового индекса блокировку, но удерживает индекс в качестве выделенного и оставляет счетчик ссылок без изменений, освобождает индекс прежнего текущего каталога (алгоритм iput), хранящийся в пространстве процесса, и запоминает в этом пространстве новый индекс. После смены процессом текущего каталога алгоритм namei использует индекс в качестве начального каталога при анализе всех имен путей, которые не берут начало от корня. По окончании выполнения системной функции chdir счетчик ссылок на индекс нового каталога имеет значение, как минимум, 1, а счетчик ссылок на индекс прежнего текущего каталога может стать равным 0. В этом отношении функция chdir похожа на функцию open, поскольку обе функции обращаются к файлу и оставляют его индекс в качестве выделенного. Индекс, выделенный во время выполнения функции chdir, освобождается только тогда, когда процесс меняет текущий каталог еще раз или когда процесс завершается.
Процессы обычно используют глобальный корневой каталог файловой системы для всех имен путей поиска, начинающихся с «/». Ядро хранит глобальную переменную, которая указывает на индекс глобального корня, выделяемый по алгоритму iget при загрузке системы. Процессы могут менять свое представление о корневом каталоге файловой системы с помощью системной функции chroot. Это бывает полезно, если пользователю нужно создать модель обычной иерархической структуры файловой системы и запустить процессы там. Синтаксис вызова функции:
chroot(pathname);
где pathname — каталог, который впоследствии будет рассматриваться ядром в качестве корневого каталога для процесса. Выполняя функцию chroot, ядро следует тому же алгоритму, что и при смене текущего каталога. Оно запоминает индекс нового корня в пространстве процесса, снимая с индекса блокировку по завершении выполнения функции. Тем не менее, так как умолчание на корень для ядра хранится в глобальной переменной, ядро освобождает индекс прежнего корня не автоматически, а только после того, как оно само или процесс-предок исполнят вызов функции chroot. Новый индекс становится логическим корнем файловой системы для процесса (и для всех порожденных им процессов) и это означает, что все пути поиска в алгоритме namei, начинающиеся с корня («/»), возьмут начало с данного индекса и что все попытки войти в каталог «..» над корнем приведут к тому, что рабочим каталогом процесса останется новый корень. Процесс передает всем вновь порождаемым процессам этот каталог в качестве корневого подобно тому, как передает свой текущий каталог.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
8.6. Изменение корневого каталога: chroot()
8.6. Изменение корневого каталога: chroot() Текущий рабочий каталог, установленный с помощью chdir() (см. раздел 8.4.1 «Изменение каталога — chdir() и fchdir()»), является атрибутом процесса, таким же, как набор открытых файлов. Он также наследуется новыми процессами.Менее известным
Пример: печать текущего каталога
Пример: печать текущего каталога Программа 2.6 реализует очередную версию команды UNIX pwd. Размер буфера определяется значением параметра МАХ_РАТН, однако проверка ошибок все равно предусмотрена, чтобы проиллюстрировать работу функции GetCurrent-Directory.Программа 2.6. pwd: печать
Выбор корневого узла
Выбор корневого узла Как вы уже видели, выбрать корневой узел можно при помощи образца выбора «/», как, например:<xsl:template match="/"> <HTML>
14.1.3. Смена текущего каталога
14.1.3. Смена текущего каталога Предусмотрено два системных вызова, меняющих текущий каталог процесса: chdir() и fchdir().#include <unistd.h>int chdir(const char * pathname);int fchdir(int fd);Первый системный вызов получает имя каталога в качестве единственного аргумента; второй принимает файловый
14.2. Смена корневого каталога
14.2. Смена корневого каталога Хотя в системе имеется один корневой каталог, значение / может меняться для каждого процесса в системе. Это обычно делается для предотвращения доступа к файловой системе со стороны сомнительных процессов (например, демоны ftp, обрабатывающие
Подразделы корневого раздела
Подразделы корневого раздела Как видите, сведения о расширениях файлов хранятся в реестре в виде упорядоченных данных (чего, к сожалению, нельзя сказать о других корневых разделах реестра, структура которых если и прослеживается, то только в некоторых местах).Но не
Другие разделы корневого раздела
Другие разделы корневого раздела Уже была рассмотрена большая часть содержимого корневого раздела реестра HKEY_CLASSES_ROOT — разделы расширения, идентификатора и раздел CLSID, но, кроме них, корневой раздел включает в себя еще несколько разделов, которые стоит описать. Некоторые
10.1.28. Получение и изменение текущего каталога
10.1.28. Получение и изменение текущего каталога Получить имя текущего каталога можно с помощью метода Dir.pwd (синоним Dir.getwd). Эти имена уже давно употребляются как сокращения от «print working directory» (печатать рабочий каталог) и «get working directory» (получить рабочий каталог). На платформе
10.1.29. Изменение текущего корня
10.1.29. Изменение текущего корня В большинстве систем UNIX можно изменить «представление» процесса о том, что такое корневой каталог /. Обычно это делается из соображений безопасности перед запуском небезопасной или непротестированной программы. Метод chroot делает указанный
Сохранение текущего документа
Сохранение текущего документа Для сохранения текущего документа в состав меню Кнопки «Office» включены команды Сохранить, которая активизируется также нажатием Shift+F12, и Сохранить как.Команду Сохранить применяют, как правило, для сохранения изменений в текущем документе
Пример 12-5. copydir, копирование файлов из текущего каталога в другое место, с помощью xargs
Пример 12-5. copydir, копирование файлов из текущего каталога в другое место, с помощью xargs #!/bin/bash# Копирует все файлы из текущего каталога# в каталог, указанный в командной строке.if [ -z "$1" ] # Выход, если каталог назначения не задан.then echo "Порядок использования: `basename $0` directory-to-copy-to"
18.3.6. Проверка текущего каталога
18.3.6. Проверка текущего каталога Некоторые сценарии, реализующие административные задачи, можно выполнять из корневого каталога. Если производится глобальное перемещение файлов или же изменяются права доступа к файлу, несложный тест позволяет уточнить, вовлекается ли в