Файловая система ОС UNIX
Ознакомиться с файловой системой ОС UNIX, механизмами ее функционирования, основными элементами файловой системы:
суперблок, описатели файлов, типы файлов, список свободных описателей файлов, список свободных блоков.
-
Ознакомиться с файловой системой ОС UNIX и программными средствами работы с ней.
-
Ознакомиться с заданием к лабораторной работе.
-
Для указанного варианта составить программу на языке Си, реализующую требуемые действия.
-
Отладить и оттестировать составленную программу, используя инструментарий ОС UNIX.
-
Защитить лабораторную работу, ответив на контрольные вопросы.
Интерфейс между пользовательской программой и внешним устройством (или между двумя пользовательскими программами) в
ОС UNIX осуществляется в рамках единой структуры данных, называемой файлом ОС UNIX.
Всякий файл ОС UNIX в соответствие с его типом может быть отнесен к одной из следующих четырех групп: обычные файлы,
каталоги, специальные файлы, каналы.
Обычный файл представляет собой совокупность блоков диска, входящих в состав файловой системы ОС UNIX. В указанных
блоках может быть произвольная информация.
Каталоги представляют собой файлы особого типа, отличающиеся от обычных, прежде всего, тем, что осуществить запись в
них может только ядро ОС UNIX, в то время как доступ по чтению может получить любой пользовательский процесс, имеющий
соответствующие полномочия. Каждый элемент каталога состоит из двух полей: поля имени файла и поля, содержащего указатель
на описатель файла, где хранится вся информация о файле: дата создания, размер, код защиты, имя владельца и т.д. В
любом каталоге содержится, по крайней мере, два элемента, содержащие в поле имени файла имена "."
и "..". Элемент каталога, содержащий в поле имени файла контекст ".",
в поле ссылки содержит ссылку на описатель файла, описывающий этот каталог. Элемент каталога, содержащий в поле имени
файла контекст "..", в поле ссылки содержит ссылку на описатель
файла, в котором хранится информация о родительском каталоге текущего каталога.
Специальные файлы - это некоторые файлы, каждому из которых ставится в соответствие свое внешнее устройство, поддерживаемое
ОС UNIX и имеющее специальную структуру. Его нельзя использовать для хранения данных, как обычный файл или каталог. В то
же время над специальным файлом можно производить те же операции, что и над обычным файлом: открывать, вводить и/или выводить
информацию и т.д. Результат применения любой из этих операций зависит от того, какому конкретному устройству соответствует
обрабатываемый специальный файл, однако в любом случае будет осуществлена соответствующая операция ввода-вывода на внешнее
устройство, которому соответствует выбранный специальный файл.
Четвертый вид файлов - каналы - будет рассмотрен отдельно в последующих лабораторных работах.
Возвращают дескриптор файла
|
open, creat, dup, pipe, close
|
Преобразуют имя в описатель
|
open, creat, chdir, chmod, stat, mkfifo, mound, mknod, link, unmount, unlink, chown
|
Назначают inode
|
creat, link, unlink, mknod
|
Работают с атрибутами
|
chown, chmod, stat
|
Ввод/вывод из файла
|
read, write, lseek
|
Работают со структурой файловой системы
|
mount, unmount
|
Управляют деревьями
|
chmod, chown
|
Остановимся на тех из них, которые требуются для выполнения лабораторной работы. Для получения информации о типе
файла необходимо воспользоваться системными вызовами stat() (fstat()).
Формат системных вызовов stat() (fstat()):
#include <sys/types.h>
#include <sys/stat.h>
int stat(const char *name, struct stat *stbuf);
int fstat(int fd, struct stat *stbuf);
Оба системных вызова помещают информацию о файле (в первом случае специфицированном именем name, а во втором -
дескриптором файла fd) в структурную переменную, на которую указывает stbuf. Вызывающая функция должна позаботиться
о резервировании места для возвращаемой информации; в случае успеха возвращается 0, в противном случае -1 и код ошибки
в errno. Описание структуры stat содержится в файле sys/stat.h.
С небольшими модификациями она имеет вид:
struct stat
{
dev_t st_dev; /* device file */
ino_t st_ino; /* file serial inode */
ushort st_mode; /* file mode */
short st_nlink; /* number of links */
ushort st_uid; /* user ID */
ushort st_gid; /* group ID */
dev_t st_rdev; /* device ident */
off_t st_size; /* size of file */
time_t st_atime; /* last access time */
time_t st_mtime; /* last modify time */
time_t st_ctime; /* last status change */
};
Поле st_mode содержит флаги, описывающие файл. Флаги несут следующую информацию:
S_IFMT 0170000 – тип файла
S_IFDIR 0040000 – каталог
S_IFCHR 0020000 – байт-ориентированный специальный файл
S_IFBLK 0060000 – блок-ориентированный специальный файл
S_IFREG 0100000 – обычный файл
S_IFFIFO 0010000 – дисциплина FIFO
S_ISUID 04000 – идентификатор владельца
S_ISGID 02000 – идентификатор группы
S_ISVTX 01000 – сохранить свопируемый текст
S_ISREAD 00400 – владельцу разрешено чтение
S_IWRITE 00200 – владельцу разрешена запись
S_IEXEC 00100 – владельцу разрешено выполнение
Символьные константы, четыре первых символа которых совпадают с контекстом S_IF,
могут быть использованы для определения типа файла.
Большинство системных вызовов, работающих с каталогами, оперируют структурой dirent,
определенной в заголовочном файле <dirent.h>.
struct dirent
{
ino_t d_ino; /* номер индексного дескриптора */
char d_name[DIRSIZ]; /* имя файла */
}
Создание и удаление каталога выполняется системными вызовами mkdir() и
rmdir(). При создании каталога посредством системного вызова mkdir()
в него помещается две ссылки ("." и "..").
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int mkdir (char *pathname, mode_t mode);
int rmdir (char *pathname);
Открытие и закрытие каталога выполняется системными вызовами opendir() и
closedir(). При успешном открытии каталога системный вызов возвращает указатель
на переменную типа DIR, являющуюся дескриптором каталога, определенную в файле
dirent.h и используемую при чтении и записи в каталог. При неудачном вызове возвращается
значение NULL.
#include <sys/types.h>
#include <dirent.h>
DIR *opendir (char *dirname);
int closedir (DIR *dirptr); /* dirptr - дескриптор каталога */
Для смены каталога служит системный вызов chdir():
#include <unistd.h>
int chdir (char *pathname);
Чтение записей каталога выполняется системным вызовом readdir(). Системный вызов
readdir() по номеру дескриптора каталога возвращает очередную запись из каталога в структуру
dirent, либо нулевой указатель при достижении конца каталога. При успешном чтении, указатель
каталога перемещается к следующей записи. Дополнительный системный вызов rewinddir() переводит
указатель каталога к первой записи каталога.
#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir (DIR *dirptr);
void rewinddir (DIR *dirptr);
-
Разработать программу, которая осуществляет просмотр текущего каталога и выводит на экран его содержимое группами в
порядке возрастания числа ссылок на файлы (в том числе имена каталогов). Группа представляет собой объединение файлов
с одинаковым числом ссылок на них.
-
Разработать программу, которая просматривает текущий каталог и выводит на экран имена всех встретившихся в нем файлов с
заданным расширением. Затем осуществляется переход в родительский каталог, который затем становится текущим, и указанные
выше действия повторяются до тех пор, пока текущим каталогом не станет корневой каталог.
-
Разработать программу, которая просматривает текущий каталог и выводит на экран имена всех встретившихся в нем
обычных файлов. Затем осуществляется переход в родительский каталог, который затем становится текущим, и указанные
выше действия повторяются до тех пор, пока текущим каталогом не станет корневой каталог.
-
Разработать программу, которая выводит на экран имена тех каталогов, которые находятся в текущем каталоге и не содержат
в себе подкаталогов.
-
Разработать программу, которая выводит на экран имена тех каталогов, которые находятся в текущем каталоге и содержат в себе
подкаталоги.
-
Разработать программу, которая выводит на экран содержимое текущего каталога, упорядоченное по времени создания файлов.
При этом имена каталогов должны выводиться последними.
-
Разработать программу, которая выводит на экран содержимое текущего каталога в порядке возрастания размеров файлов.
При этом имена каталогов должны выводиться первыми.
-
Разработать программу, которая выводит на экран содержимое текущего каталога в алфавитном порядке. Каталоги не выводить.
-
Разработать программу, которая просматривает текущий каталог и выводит на экран имена всех встретившихся в нем
каталогов. Затем осуществляется переход в родительский каталог, который затем становится текущим, и указанные
выше действия повторяются до тех пор, пока текущим каталогом не станет корневой каталог.
-
Разработать программу, которая осуществляет просмотр текущего каталога и выводит на экран имена находящихся в нём
каталогов, упорядочив их по числу файлов и каталогов, содержащихся в отображаемом каталоге. Для каждого такого каталога
указывается число содержащихся в нём файлов и каталогов.
-
Что представляет собой суперблок?
-
Что представляет собой список свободных блоков?
-
Что представляет собой список свободных описателей файлов?
-
Как производится выделение свободных блоков под файл?
-
Как производится освобождение блоков данных, занятых под файл?
-
Каким образом осуществляется монтирование дисковых устройств?
-
Каково назначение элементов структуры stat?
-
Каким образом осуществляется защита файлов в ОС UNIX?
-
Каковы права доступа к файлу, при которых владелец может выполнять все операции (r, w, x), а прочие пользователи -
только читать?
-
Что выполняет системный вызов lseek(fd, (off_t)0, SEEK_END)?