Всего в операционной системе предусмотрено семь типов файлов, которые будут рассматриваться в отдельной главе. Пока достаточно считать, что существуют только обычные файлы и каталоги. Пользователи получают во владение созданные ими объекты файловой системы и имеют определенные системой или администратором права доступа к существующим объектам. Всего существует три первичных и относительно независимых вида доступа (mode) к файлам:
· чтение (r– read);
· запись (w– write);
· исполнение (x– execute).
Запись и чтение файла предполагают его поиск и открытие. На первом этапе система должна найти имя файла в явно указанном каталоге либо, если путь к файлу не указан, но содержится в переменной окружения оболочки, попытаться найти его. Если путь к файлу пролегает через несколько каталогов, каждый из них последовательно открывается и в нем производится поиск имени следующего подкаталога или целевого файла [6].
На втором этапе поиска по найденному имени в файловой системе обнаруживается нужный индексный дескриптор файла и считываются его метаданные, включая права доступа к нему. При открытии файла в числе параметров задается цель его открытия: для чтения, для записи, для добавления либо для чтения и записи. Права доступа к существующему файлу проверяются на этапе его открытия. Если цель открытия файла не соответствует правам пользователя, в доступе будет отказано. Следует отметить, что доступ к файлу означает доступ к блокам, где хранятся его данные. Метаданные недоступного файла не закрываются, и нарушитель может узнать адреса блоков данных, где хранится файл. Угрозу это представляет лишь в том случае, если нарушителю доступны операции с блоками дисковой памяти в обход файловой системы.
Если права доступа совпадают с затребованными, открываемому файлу присваивается учетный номер – файловый дескриптор (не путать с индексным дескриптором!), а найденные блоки данных файла копируются с дискового пространства в оперативную память. Информацию об открытых файлах и их связи с пользователями и процессами можно получить с помощью утилиты lsof (list opened file).
Если открываемый файл не существует, он может быть создан с правами доступа, задаваемыми явно или по умолчанию.
Право чтения позволяет считывать блоки данных из файла. Право записи в файл не требует его просмотра. В зависимости от того, какой режим записи предусматривается, данные могут записываться либо в конец файла (дописывание), либо в выбранный сегмент, начало которого обозначается файловым указателем. При этом данные из буфера программы заменяют прежние данные.
После окончания доступа файл требуется закрыть, что означает разрыв связи между открытым файлом и файловым дескриптором, и сохранить изменения в файле на диск (если файл открывался для записи или добавления).
На самом деле файл при закрытии сохраняется только в дисковом кэше – специально выделенной области оперативной памяти. Обосновывается это тем, что дисковые операции являются самыми продолжительными, и системе не стоит обращаться к дисковой памяти ради такого пустяка, как сохранение изменений в одном файле. Сохранение данных на диск производится обычно в массовом порядке: при переполнении кэша, истечении определенного времени, завершении работы либо перезагрузке системы. Но при создании файла в нем можно предусмотреть специальный атрибут, требующий в исключительном порядке его сохранение сразу на диск. При проведении лабораторных работ по исследованию архитектуры файловых систем и восстановлению данных обучаемые ближе познакомятся с этой особенностью современных файловых систем.
Право исполнения имеет смысл только по отношению к программе. Операционная система не распознает типы обычных файлов, но для программ она делает исключение. Бинарные исполняемые файлы формата ELF распознаются по характерной сигнатуре 0x7F454C46 в начале файла.
Запуск файла на исполнение означает создание нового процесса. Первые фазы, связанные с поиском файла и проверкой прав доступа, в принципе совпадают с вышерассмотренными действиями. Полный путь к исполняемым файлам задается в переменной окружения PATH. Создание процесса также сопровождается копированием исполняемого файла в оперативную память, причем сегменты кода, данных и стека размещаются в раздельных областях памяти.
По отношению к текстовой программе – сценарию – одно только право исполнения ничего не дает. Для запуска сценария требуется еще право на его чтение, т. к. оболочка читает строки сценария, производит их лексический анализ и интерпретацию, т. е. преобразование текстовых команд в бинарный код, который оболочка передает центральному процессору.
Текстовую программу (сценарий) можно запустить, имея только право чтения. Для этого в командной строке требуется указать вначале имя командного интерпретатора, а затем имя сценария, например