Читаем Разработка приложений в среде Linux. Второе издание полностью

Если для пользователей необходимо отображать текущий путь каталога, хорошим решением будет проверка переменной окружения PWD. Если она установлена, она содержит путь, который применяется пользователем и который может содержать символические ссылки на некоторые элементы пути. Этот путь обычно и должен отображаться приложением по желанию пользователя. Для облегчения задачи библиотека С в Linux предоставляет функцию get_current_dir_name(), реализуемую следующим образом.

char * get_current_dir_name() {

char * env = getenv("PWD");

if (env)

 return strdup(env);

else

 return getcwd(NULL, 0);

}

<p>14.1.2. Специальные файлы <code>.</code></span><span> и </span><span><code>..</code></span><span></p>

Каждый каталог, включая корневой, содержит также два специальных файла под именами . и .., полезные при определенных условиях. Первый, . — то же самое, что и текущий каталог. Это означает, что имена somefile и ./somefile эквивалентны.

Еще одно специальное имя файла, .., является родительским каталогом текущего каталога. В случае корневого каталога .. относится к самому корневому каталогу (поскольку у корневого каталога нет родительского каталога).

И ., и .. можно применять везде, где можно использовать имя каталога. Нормально то, что отношение символических ссылок к путям вроде ../include/mylib и именам файлов наподобие /./foo/.././bar/./fubar/../../usr/bin/less является законным (хотя эти названия довольно запутаны)[101].

<p>14.1.3. Смена текущего каталога</p></span><span>

Предусмотрено два системных вызова, меняющих текущий каталог процесса: chdir() и fchdir().

#include

int chdir(const char * pathname);

int fchdir(int fd);

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

<p>14.2. Смена корневого каталога</p></span><span>

Хотя в системе имеется один корневой каталог, значение / может меняться для каждого процесса в системе. Это обычно делается для предотвращения доступа к файловой системе со стороны сомнительных процессов (например, демоны ftp, обрабатывающие запросы ненадежных пользователей). Например, если в качестве корневого каталога процесса определен /home/ftp, запуск chdir("/") сделает текущий каталог процесса /home/ftp, a getcwd() вернет / для поддержания последовательности данного процесса. С целью обеспечения безопасности, если процесс пытается выполнить chdir("/.."), он остается в своем каталоге / (каталог /home/ftp в масштабах всей системы), так же как и нормальные процессы, выполняющие chdir("/..") остаются в корневом каталоге в масштабах всей системы. Процесс может легко изменять свой текущий корневой каталог с помощью системного вызова chroot(). Но путь нового корневого каталога процесса интерпретируется с помощью текущего установленного корневого каталога, поэтому chroot("/") не модифицирует текущий корневой каталог процесса.

#include

int chroot(const char * path);

Здесь path определяет новый корневой каталог для процесса. Этот системный вызов, однако, не изменяет текущий каталог процесса. У процесса все еще есть доступ к файлам в текущем каталоге, а также в родственном ему каталоге (../../directory/file). Большинство процессов, выполняющих chroot(), немедленно меняют свои текущие каталоги, чтобы находиться внутри новой корневой иерархии, с помощью chdir("/") или чего-либо подобного. Отмена этого действия может вызвать проблемы с безопасностью в некоторых приложениях.

<p>14.3. Создание и удаление каталогов</p></span><span><p>14.3.1. Создание новых каталогов</p></span><span>

Создание новых каталогов выполняется очень просто.

#include

#include

int mkdir(const char * dirname, mode_t mode);

Путь, определенный в dirname, создается как новый каталог с полномочием mode (что модифицируется umask процесса). Если dirname определяет существующий файл, или некоторые элементы dirname не являются каталогом или символической ссылкой на него, системный вызов не удается.

<p>14.3.2. Удаление каталогов</p></span><span>

Удаление каталога — это практически то же, что и удаление файла; меняется разве что имя системного вызова.

#include

int rmdir(char * pathname);

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

Программирование, программы, базы данных / Программное обеспечение / Книги по IT