Базовые примитивы доступа к файлам 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Базовые примитивы доступа к файлам



Базовые примитивы доступа к файлам состоят из небольшого набора системных вызовов, которые обеспечивают прямой доступ к средствам ввода/вывода, обеспечиваемым ядром UNIX.

Примитивы UNIX:

ИмяФункция

open Открывает файл для чтения или записи либо создает пустой файл

creat Создает пустой файл

close Закрывает открытый файл

ead Считывает информацию из файла

write Записывает информацию в файл

lseek Перемещается в заданную позицию в файле

unlink Удаляет файл

remove Другой метод удаления файла

Типичная программа UNIX вызывает для инициализации файла вызов open (или creat), а затем использует вызовы read, write или lseek для работы с данными в файле. Если файл больше не нужен программе, она может вызвать close, показывая, что работа с файлом завершена. Если пользователю больше не нужен файл, его можно удалить из системы при помощи вызова unlink или remove.

6. Системные вызовы идентификации пользователей и права доступа

Фактически для идентификации пользователя в системе UNIX нужен только идентификатор user-id. Каждый процесс UNIX обычно связывается с идентификатором пользователя, который запустил его на выполнение. При этом процесс является просто экземпляром выполняемой программы. При создании файла система устанавливает его владельца на основе идентификатора uid, создающего файл процесса.

Владелец файла позже может быть изменен, но только суперпользователем или владельцем файла. Следует отметить, что суперпользователь имеет имя root и его идентификатор uid всегда равен 0.

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

Группы пользователей определяются в файле /etc/group. Каждая из них определена своим идентификатором gid, который, как и uid, является неотрицательным числом. Группа пользователя по умолчанию задается четвертым полем записи о нем в файле паролей.

Права доступа определяют возможности доступа к файлу других пользователей. Они затрагивают три группы пользователей:

1) владелец файла;

2) все пользователи, кроме владельца файла, принадлежащие к связанной с файлом группе;

3) все пользователи, не входящие в категории 1 или 2.

Для каждой категории пользователей существуют три основных типа прав доступа к файлам. Они определяют, может ли пользователь определенной категории выполнять:

– чтение из файла;

– запись в файл;

– запуск файла на выполнение. В этом случае файл обычно является программой или последовательностью команд оболочки.

Система хранит связанные с файлом права доступа в битовой маске, называемой кодом доступа к файлу (file mode). Хотя заголовочный файл <sys/stat.h> и определяет символьные имена для битов прав доступа

Файлы с несколькими именами

Один и тот же набор данных может быть связан с несколькими именами UNIX без необходимости создания копий файла.

Каждое такое имя называется жесткой ссылкой (hard link). Число связанных с файлом ссылок называется счетчиком ссылок (link count).

Новая жесткая ссылка создается при помощи системного вызова link, а существующая жесткая ссылка может быть удалена при помощи системного вызова unlink. Системный вызов st_nlink. Число ссылок, указывающих на этот файл (другими словами, число различных имен файла, так как жесткие ссылки неотличимы от «настоящего» имени). Это значение обновляется при каждом системном вызове link и unlink.

Системный вызов link.

Оriginal_path – указатель на массив символов, содержащий полное имя файла в системе UNIX. Он должен задавать существующую ссылку на файл. New_path – задает новое имя файла или ссылку на файл, но файл, заданный параметром new_path, еще не должен существовать. Системный вызов link возвращает значение 0 в случае успешного завершения и -1 – в случае ошибки. В последнем случае новая ссылка на файл не будет создана.

Системный вызов unlink. Фактически системный вызов unlink просто удаляет указанную ссылку и уменьшает счетчик ссылок (link count) файла на единицу. Данные в файле будут безвозвратно потеряны только после того, как счетчик ссылок на него станет равным нулю, и он не будет открыт ни в одной программе.

Системный вызов symlink. Symlink используется для создания символьной ссылки.

После завершения вызова symlink создается файл symname, указывающий на файл realname. Если возникает ошибка, например, если файл с именем symname уже существует, то вызов symlink возвращает значение -1. В случае успеха вызов возвращает нулевое значение. Если затем файл символьной ссылки открывается при помощи open, то системный вызов open корректно прослеживает путь к файлу realname.

Системный вызов readlink. Используется, если необходимо считать данные из самого файла symname.

Системный вызов readlink вначале открывает файл sympath, затем читает его содержимое в переменную buffer, и, наконец, закрывает файл sympath. Возвращаемое вызовом readlink значение равно числу символов в буфере или -1 – в случае ошибки.

Каталоги, файловые системы и специальные файлы

Каталоги – хранят имена файлов и позволяют пользователям группировать произвольные наборы файлов. Кроме файлов они также могут включать другие каталоги, которые называются подкаталогами и позволяют организовать следующие уровни классификации.

Реализация каталогов.

Каталоги имеют владельца, группу, размер и связанные с ними права доступа. Каталоги не могут быть созданы при помощи системных вызовов creat или open. Системный вызов open также не будет работать с каталогом, если установлен любой из флагов O_WRONLY или O_RDWR.

Структура каталогов состоит из набора элементов каталогов, по одному элементу для каждого содержащегося в них файла или подкаталога. Каждый элемент каталога состоит хотя бы из одного положительного числа, номера индексного дескриптора (inode number), и символьного поля, содержащего имя файла. При разработке программ не следует полагаться на формат каталога, а для того, чтобы сделать их переносимыми, необходимо использовать для работы с каталогами системные вызовы из спецификации XSI.

Cистемный вызов opendir – служит для открытия каталога.

Передаваемый вызову opendir параметр является именем открываемого каталога. При успешном открытии каталога dirname вызов opendir возвращает указатель на переменную типа DIR. Определение типа DIR, представляющего дескриптор открытого каталога, находится в заголовочном файле <dirent.h>. Это определение аналогично определению типа FILE, используемого в стандартной библиотеке ввода/вывода. Указатель позиции ввода/вывода в полученном от функции opendir дескрипторе установлен на первую запись каталога. Если вызов завершился неудачно, то функция возвращает NULL.

Cистемный вызов closedir – служит для закрытия каталога (после окончания работы программы).

Вызовы readdir и rewinddir.

Функции readdir должен передаваться допустимый указатель на дескриптор открытого каталога, обычно возвращаемый предшествующим вызовом opendir. При первом вызове readdir в структуру dirent будет считана первая запись в каталоге. В результате успешного вызова указатель каталога переместится на следующую запись. Когда в результате последующих вызовов readdir достигнет конца каталога, то вызов вернет нулевой указатель. Если в какой-то момент потребуется начать чтение каталога с начала, то можно использовать системный вызов rewinddir.

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

Cистемный вызов mkdir – создание каталогов и подкаталогов. mkdir возвращает нулевое значение в случае успеха, и -1 - в случае неудачи



Поделиться:


Последнее изменение этой страницы: 2016-08-14; просмотров: 156; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 44.222.146.114 (0.03 с.)