В этой главе будут рассмотрены основные примитивы для работы с файлами, предоставляемые системой UNIX. Эти примитивы состоят из небольшого набора системных вызовов, которые обеспечивают прямой доступ к средствам ввода/вывода, обеспечиваемым ядром UNIX. Они образуют строительные блоки для всего ввода/вывода в системе UNIX, и многие другие механизмы доступа к файлам в конечном счете основаны на них. Названия этих примитивов приведены в табл. 2.1. Дублирование функций, выполняемых различными вызовами, соответствует эволюции UNIX в течение последнего десятилетия.
Типичная программа UNIX вызывает для инициализации файла вызов fdopen (или fdcreat), а затем использует вызовы fdread, fdwrite или fdseek для работы с данными в файле. Если файл больше не нужен программе, она может вызвать fdclose, показывая, что работа с файлом завершена. Наконец, если пользователю больше не нужен файл, его можно удалить из системы при помощи вызова unlink.
Следующая программа, читающая начальный фрагмент некоторого файла, более ясно демонстрирует эту общую схему. Так как это всего лишь вступительный пример, мы опустили некоторые необходимые детали, в частности обработку ошибок. Заметим, что такая практика совершенно недопустима в реальных программах.
Таблица 2.1. Примитивы UNIX
Имя |
Функция |
fdopen |
Открывает файл для чтения или записи либо создает пустой файл |
fdcreat |
Создает пустой файл |
fdclose |
Закрывает открытый файл |
fdread |
Считывает информацию из файла |
fdwrite |
Записывает информацию в файл |
fdseek |
Перемещается в заданную позицию в файле |
unlink |
Удаляет файл |
fcntl |
Управляет связанными с файлом атрибутами |
(* элементарный пример *)
uses linux;
var
fd:integer;
nread:longint;
buf:array [0..1024-1] of char;
begin
(* Открыть файл 'data' для чтения *)
fd := fdopen ('data', Open_RDONLY);
(* Прочитать данные *)
nread := fdread (fd, buf, 1024);
(* Закрыть файл *)
fdclose (fd);