Опубликован: 16.09.2004 | Уровень: специалист | Доступ: свободно | ВУЗ: Московский физико-технический институт
Лекция 8:

Организация файловой системы в UNIX. Работа с файлами и директориями. Понятие о memory mapped файлах

Специальные функции для работы с содержимым директорий

Стандартные системные вызовы open() , read() и close() не могут помочь программисту изучить содержимое файла типа " директория ". Для анализа содержимого директорий используется набор функций из стандартной библиотеки языка C.

Функция opendir()

Прототип функции

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(char *name);

Описание функции

Функция opendir служит для открытия потока информации для директории, имя которой расположено по указателю name. Тип данных DIR представляет собой некоторую структуру данных, описывающую такой поток. Функция opendir подготавливает почву для функционирования других функций, выполняющих операции над директорией, и позиционирует поток на первой записи директории.

Возвращаемое значение

При удачном завершении функция возвращает указатель на открытый поток директории, который будет в дальнейшем передаваться в качестве параметра всем другим функциям, работающим с этой директорией. При неудачном завершении возвращается значение NULL.

С точки зрения программиста в этом интерфейсе директория представляется как файл последовательного доступа, над которым можно совершать операции чтения очередной записи и позиционирования на начале файла. Перед выполнением этих операций директорию необходимо открыть, а после окончания – закрыть. Для открытия директории используется функция opendir() , которая подготавливает почву для совершения операций и позиционирует нас на начале файла. Чтение очередной записи из директории осуществляет функция readdir() , одновременно позиционируя нас на начале следующей записи (если она, конечно, существует). Для операции нового позиционирования на начале директории (если вдруг понадобится) применяется функция rewinddir() . После окончания работы с директорией ее необходимо закрыть с помощью функции closedir() .

Функция readdir()

Прототип функции

#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dir);

Описание функции

Функция readdir служит для чтения очередной записи из потока информации для директории.

Параметр dir представляет собой указатель на структуру, описывающую поток директории, который вернула функция opendir() .

Тип данных struct dirent представляет собой некоторую структуру данных, описывающую одну запись в директории. Поля этой записи сильно варьируются от одной файловой системы к другой, но одно из полей, которое собственно и будет нас интересовать, всегда присутствует в ней. Это поле char d_name[ ] неопределенной длины, не превышающей значения NAME_MAX+1, которое содержит символьное имя файла, завершающееся символом конца строки. Данные, возвращаемые функцией readdir , переписываются при очередном вызове этой функции для того же самого потока директории.

Возвращаемое значение

При удачном завершении функция возвращает указатель на структуру, содержащую очередную запись директории. При неудачном завершении или при достижении конца директории возвращается значение NULL.

Функция rewinddir()

Прототип функции

#include <sys/types.h>
#include <dirent.h>
void rewinddir(DIR *dir);

Описание функции

Функция rewinddir служит для позиционирования потока информации для директории, ассоциированного с указателем dir (т.е. с тем, что вернула функция opendir() ), на первой записи (или на начале) директории.

Функция closedir()

Прототип функции

#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dir);

Описание функции

Функция closedir служит для закрытия потока информации для директории, ассоциированного с указателем dir (т.е. с тем, что вернула функция opendir() ). После закрытия поток директории становится недоступным для дальнейшего использования.

Возвращаемое значение

При успешном завершении функция возвращает значение 0, при неудачном завершении – значение -1.

Написание, прогон и компиляция программы, анализирующей содержимое директории

Напишите, откомпилируйте и прогоните программу, распечатывающую список файлов, входящих в директорию, с указанием их типов. Имя директории задается как параметр командной строки. Если оно отсутствует, то выбирается текущая директория.

Задача повышенной сложности: напишите программу, распечатывающую содержимое заданной директории в формате, аналогичном формату выдачи команды ls -al. Для этого вам дополнительно понадобится самостоятельно изучить в UNIX Manual функцию ctime(3) и системные вызовы time(2), readlink(2). Цифры после имен функций и системных вызовов – это номера соответствующих разделов для UNIX Manual.

лия логовина
лия логовина

организовать двустороннюю поочередную связь процесса-родителя и процесса-ребенка через pipe, используя для синхронизации сигналы sigusr1 и sigusr2.

Макар Оганесов
Макар Оганесов
Сергей Пархоменко
Сергей Пархоменко
Россия, Ростов-на-Дону, ЮФУ (ДГТУ), 2008