Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
124
Добавлен:
20.06.2014
Размер:
6.61 Mб
Скачать

23. Файловая система ос unix: монтирование, индексные дескрипторы, жесткие и символические ссылки, файлы устройств.

В UNIX файл. система представл собой единое дерево каталогов, в имя файла не входит имя устр-ва. Прежде чем состоится работа с файлами, соответс файловая система должна быть встроена в существующ иерархическое дерево. Только после этого ядро сможет выполнять файловые операции, эта операция встраивания – монтирование файловой системы. Монтирование файловой системы производится системным вызовом mount(). В случае если в системе есть неск дисков, то 1 из них корневой, а остальные – мантируются в тот или иной каталог – точка монтирования. При этом при указании полных путей к файлам на этом диске, необходимо к полному имени файла в рамках диска добавить полный путь точки монтирования: дискета на ней word папка в ней файл prog.c сама дискета смонтирована в каталог /mnt/floppy. Тогда полный путь к файлу: /mnt/floppy/work/prog.c

Индексные дискрипторы.В UNIX каталоги хранят имя файла и некот номер, позволяющий определить соот-щий флаг. Все остальные данные о файле связаны с этим номером. Хранимая на внешн носителе структура данных, сод всю информац о файле, кроме имени назыв индексным дескриптором.

Жесткая ссылка – когда 2 или более имен файлов расположены в разных каталогах, но в рамках 1 диска ссылаются на 1 и тот же индексный дескриптор. Нумерация индекс дескрипторов в рамках своего диска своя. Создание жестких ссылок на каталоги запрещается. Доп имя файла м. получить с пом систем вызова Link:

int link(const char*oldpath, const char*newpath); в индексном дескрипторе есть счетчик ссылок на данный дескриптор. Ф-я для удаления файла unlink() – удаляет указан жесткую ссылку, имя удал-ся из каталога, а счетчик ссылок обнуляется. В burnshell команда ln создает жесткую ссылку.

Символические ссылки. Разница между каталогом и файлом – это значение признака типа в индексном дескрипторе. ОС UNIX поддерж и другие спец типы файлов: файлы байт ориентирован и блок ориентир-х устр-в, имена сокетов, именов-е каналы FIFO и символ ссылки. Симв ссылки – файл спец типа содержащие имя другого файла. В отличии от жесткой символ ссылки легко отлечима от имени файла. int sinLink(const char*oldpath,const char*newpath).

Удаление происходит unlink(). Ком-да создания символ ссылки ln-s.

Файлы уср-в: Любое устр-во в Unix – это файл спец типа. Сделать образ диска можно с пом. команды:>cat /dev/cdrom>image.iso

Форматир-е диска:1)открыть спец файл соотв диску.2)спозиционировать на нужный сектор lseek.3)выдать обычный write. Кроме общих операций с файлами к устр-вам примен свои доп операции, все операции этой категории, выполн с пом сист вызова:

Int IOctl(int fd,int request,…)

24.Системные вызовы для работы с файлами

Открытие файла на чтение или запись с пом системного вызова:

Include <fcntl.h>. Если файл не существует, он может быть создан.

int open(const char*name, int mode, [int perm]). Первый аргумент является указателем на имя файла. Аргумент mode указывает на режим открытия файла и представляет собой побитное объединение флагов, с помощью операции ИЛИ (O_RDONLY, O_WRONLY, O_RDWR). Аргумент perm, определяющий права доступа к файлу, используется только при создании файла или если во втором пар-ре использовали O_CREATE. Именно из 3 пар-ра будет вычит значение umask. Если операция открытия файла закончилась удачно, то будет возвращен

файловый дескриптор — указатель на файл, использующийся в последующих операциях чтения, записи и т. д. В случае неудачи open возвратит -1, а глобальная переменная errno будет содержать код ошибки. Дескрипторы можно использ для потоков в/в. Мы можем закрыть люб дескриптор.

Закрытие файла Include <unistd.h>. int close(int fd); Функция разрывает связь между файловым дескриптором и открытым файлом. В случае успеха close возвращает нулевое значение, в противном случае возвращается -1 .

Чтение из файла происходит с пом:

int read(int fd, void*buf, int len)

Функции read позволяет считывать данные из файла, на который указывает файловый дескриптор. Считанные данные помещаются в бу-

фер приложения, указатель на который передается в аргументе buf. Общее число считанных байт в нормальной ситуации равно сумме размера буфера Len. Возврат больше 0 –кол-во прочитанных байтов, если read вернул 0 – то конец файла.

Запись в файл: Функция используется для записи данных в файл:

int write (int fd, void*buf,int len)

Данные для записи в файл находятся в буфере, указанном аргументом buf . После завершения операции значение файлового указателя будет увеличено на len – кол-во данных.

Позиционирование – последоват-ный порядок чтения из файла может быть нарушен, изменив в явном виде значение текущей позиции, связан с файловым дескриптором – с пом сист вызова:

int lseek(int fd, int offset, int whence). С помощью функции lseek можно установить файловый указатель на любое место файла и тем самым обеспечить прямой доступ к любой части файла. Интерпретация аргумента offset зависит от аргумента whence, который может принимать следующие значения:

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

Int c, char buf[100]; fd=open(“f.dat”,O_RDONLY);

Lseek(fd, -100,SEEK_ENT);

c=read(fd,buf,100);close(fd);