Если для пользователей необходимо отображать текущий путь каталога, хорошим решением будет проверка переменной окружения PWD
get_current_dir_name()
, реализуемую следующим образом.char * get_current_dir_name() {
char * env = getenv("PWD");
if (env)
return strdup(env);
else
return getcwd(NULL, 0);
}
14.1.2. Специальные файлы .
..
Каждый каталог, включая корневой, содержит также два специальных файла под именами .
..
, полезные при определенных условиях. Первый, .
— то же самое, что и текущий каталог. Это означает, что имена somefile
и ./somefile
эквивалентны.Еще одно специальное имя файла, ..
..
относится к самому корневому каталогу (поскольку у корневого каталога нет родительского каталога).И .
..
можно применять везде, где можно использовать имя каталога. Нормально то, что отношение символических ссылок к путям вроде ../include/mylib
и именам файлов наподобие /./foo/.././bar/./fubar/../../usr/bin/less
является законным (хотя эти названия довольно запутаны)[101].14.1.3. Смена текущего каталога
Предусмотрено два системных вызова, меняющих текущий каталог процесса: chdir()
fchdir()
.#include
int chdir(const char * pathname);
int fchdir(int fd);
Первый системный вызов получает имя каталога в качестве единственного аргумента; второй принимает файловый дескриптор, являющийся открытым каталогом. В каждом случае специфицированный каталог делается текущим рабочим каталогом. Эти функции могут не работать, если в аргументе определен файл, который не является каталогом, или если у процесса нет соответствующих полномочий.
14.2. Смена корневого каталога
Хотя в системе имеется один корневой каталог, значение /
/home/ftp
, запуск chdir("/")
сделает текущий каталог процесса /home/ftp
, a getcwd()
вернет /
для поддержания последовательности данного процесса. С целью обеспечения безопасности, если процесс пытается выполнить chdir("/..")
, он остается в своем каталоге /
(каталог /home/ftp
в масштабах всей системы), так же как и нормальные процессы, выполняющие chdir("/..")
остаются в корневом каталоге в масштабах всей системы. Процесс может легко изменять свой текущий корневой каталог с помощью системного вызова chroot()
. Но путь нового корневого каталога процесса интерпретируется с помощью текущего установленного корневого каталога, поэтому chroot("/")
не модифицирует текущий корневой каталог процесса.#include
int chroot(const char * path);
Здесь path
../../directory/file
). Большинство процессов, выполняющих chroot()
, немедленно меняют свои текущие каталоги, чтобы находиться внутри новой корневой иерархии, с помощью chdir("/")
или чего-либо подобного. Отмена этого действия может вызвать проблемы с безопасностью в некоторых приложениях.14.3. Создание и удаление каталогов
14.3.1. Создание новых каталогов
Создание новых каталогов выполняется очень просто.
#include
#include
int mkdir(const char * dirname, mode_t mode);
Путь, определенный в dirname
mode
(что модифицируется umask
процесса). Если dirname
определяет существующий файл, или некоторые элементы dirname не являются каталогом или символической ссылкой на него, системный вызов не удается.14.3.2. Удаление каталогов
Удаление каталога — это практически то же, что и удаление файла; меняется разве что имя системного вызова.
#include
int rmdir(char * pathname);