Основы программирования в Linux
<b>#include <unistd.h></b><b>int chdir(const char *path);</b>Программа может определить свой текущий рабочий каталог, вызвав функцию
.getcwd<b>#include <unistd.h></b><b>char *getcwd(char *buf, size_t size);</b>Функция
записывает имя текущего каталога в заданный буферgetcwd. Она возвращаетbuf, если имя каталога превысит размер буфера (ошибкаNULL), заданный в параметреERANGE. В случае успешного завершения она возвращаетsize.bufФункция
может также вернуть значениеgetcwd, если во время выполнения программы каталог удален (NULL) или изменились его права доступа (EINVAL).EACCESSПросмотр каталогов
Широко распространенная проблема систем Linux — просмотр каталогов, т.е. определение файлов, размещенных в конкретном каталоге. В программах командной оболочки она решается легко — просто скомандуйте оболочке выполнить подстановку в выражении с метасимволами. В прошлом в разных вариантах UNIX был разрешен программный доступ к низкоуровневой структуре файловой системы. Вы все еще можете открывать каталог как обычный файл и непосредственно считывать элементы каталога, но разные структуры файловых систем и реализации сделали такой подход непереносимым с машины на машину. Был разработан стандартный комплект библиотечных функций, существенно упрощающий просмотр каталогов.
Функции работы с каталогами объявлены в заголовочном файле dirent.h. В них используется структура
как основа обработки каталогов. Указатель на эту структуру, называемый потоком каталога (DIR), действует во многом так же, как действует поток файла (DIR*) при работе с обычным файлом. Элементы каталога возвращаются в структурах dirent, также объявленных в файле dirent.h, поскольку никому не следует изменять поля непосредственно в структуреFILE*.DIRМы рассмотрим следующие функции:
□
,opendir;closedir□
;readdir□
;telldir□
;seekdir□
.closediropendir
Функция
открывает каталог и формирует поток каталога. Если она завершается успешно, то возвращает указатель на структуруopendir, которая будет использоваться для чтения элементов каталога.DIR<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>DIR *opendir(const char *name);</b>В случае неудачи функция opendir возвращает пустой указатель. Имейте в виду, что для доступа к самому каталогу поток каталога использует низкоуровневый дескриптор файла, поэтому opendir может дать сбой, если открыто слишком много файлов.
readdir
Функция
возвращает указатель на структуру, содержащую следующий элемент каталога в потоке каталогаreaddir. Успешные вызовыdirpвозвращают следующие элементы каталогов. При возникновении ошибки и в конце каталогаreaddirвозвращаетreaddir. Системы, удовлетворяющие стандарту POSIX, возвращаяNULL, не меняют переменнуюNULLв случае достижения конца каталога и устанавливают ее значение, если обнаружена ошибка.errno<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>struct dirent *readdir(DIR *dirp);</b>Просмотр каталога с помощью функции
не гарантирует формирование списка всех файлов (и подкаталогов) в каталоге, если в это время выполняются другие процессы, создающие и удаляющие файлы в каталоге.readdirВ состав структуры
, содержащей реквизиты элемента каталога, входят следующие компоненты.dirent□
— индекс файла;ino_t d_ino□
— имя файла.char d_name[]Для выяснения других реквизитов файла в каталоге вам необходимо вызвать
, который мы обсуждали ранее.stattelldir
Функция
возвращает значение, регистрирующее текущую позицию в потоке каталога. Вы можете использовать ее в последующих вызовах функцииtelldirдля переустановки просмотра каталога, начиная с текущей позиции.seekdir<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>long int telldir(DIR *dirp);</b>seekdir
Функция
устанавливает указатель на элемент каталога в потоке каталога, заданном в параметреseekdir. Значение параметраdirp, применяемого для установки позиции, следует получить из предшествующего вызова функцииloc.telldir<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>void seekdir (DIR *dirp, long int loc);</b>closedir
Функция
закрывает поток каталога и освобождает ресурсы, выделенные ему. Она возвращает 0 в случае успеха и -1 при наличии ошибки.closedir<b>#include <sys/types.h></b><b>#include <dirent.h></b><b>int closedir(DIR *dirp);</b>В приведенной далее программе printdir.c (упражнение 3.4) вы соберете вместе множество функций обработки файлов для создания простого перечня содержимого каталога. Каждый файл представлен отдельной строкой. У каждого подкаталога есть имя, за которым следует слэш, и файлы, содержащиеся в подкаталоге, выводятся с отступом шириной в четыре пробела.