Произвольный доступ

Опубликовано в Технологии > Серверные технологии Продолжение

При открытии файла позиция в нем может быть установлена на начало файла (например, для последовательного доступа к файлу) или на конец файла (например, для добавления данных в существующий файл). После открытия файла позиция в нем может быть изменена путем вызова функции lseek. Функция lseek принимает три параметра с указанием дескриптора файла, смещения и точки отсчета смещения. Третий параметр позволяет в приложении указать, определяет ли это смещение абсолютное положение в файле (например, байт 512), новое положение относительно текущей позиции (например, байт, находящийся на расстоянии 64 байтов от текущей позиции) или положение относительно конца файла (например, за 2 байта до конца файла). В частности, константа LJ5ET определяет, что система должна интерпретировать смещение как абсолютную величину. Таким образом, для указания на то, что текущая позиция в файле с дескриптором fdesc должна быть перемещена к байту номер 100, применяется вызов: lseek(fdesc,100L,LJ3ET); . эхолоты humminbird

В других операционных системах для обозначения той структуры, которая в системе UNIX называется каталогом, иногда используется термин папка.

Выполнение поиска за пределами файла

Файловая система UNIX позволяет в приложении перейти в любую позицию файла, даже если указанная позиция находится за пределами текущего конца файла. Если в приложении будет выполнена установка новой позиции в пределах файла и запись новых данных, эти данные заменят старые данные, находившиеся ранее в этой позиции. Если же в приложении позиция будет установлена за пределами файла и выполнена запись новых данных, то файловая система увеличит размер файла. С точки зрения пользователя, создается впечатление, что система заполняет промежуток между существующими данными и новыми данными, записанными за пределами файла, нулевыми байтами (байтами со значением нуль). В дальнейшем, при осуществлении в приложении попытки чтения байтов в позиции, относящейся к этому промежутку, файловая система возвращает байты с нулевыми значениями. Этот принцип проиллюстрирован на рис. 24.3.

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

Позиция в файле и параллельный доступ

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

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

Понимание, в чем состоит разница между указателем позиции в файле и самим файлом, необходимо при изучении операций с удаленными файлами. Сформулируем это понятие.

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