Скачиваний:
65
Добавлен:
08.01.2014
Размер:
2.6 Mб
Скачать

Предостережение

Здесь необходимо сделать несколько предостережений. Во-первых, существует предельное число файлов, которые могут быть одновременно открыты программой, – в стандарте POSIX (а следовательно, и в спецификации XSI) не менее двадцати1. Чтобы обойти эту проблему, требуется использовать системный вызов fdclose, тем самым сообщая системе, что работа с файлом закончена. Вызов fdclose будет рассмотрен в разделе 2.1.5. Может также существовать предел суммарного числа файлов, открытых всеми процессами, определяемый размером таблицы в ядре. Во-вторых, в ранних версиях UNIX и в параметре flags непосредственно задавались численные значения. Это все еще достаточно распространенный, хотя и не совсем удовлетворительный прием – задание численных значений вместо имен постоянных, определенных в модуле linux. Поэтому может встретиться оператор типа

filedes := fdopen(filename, 0);

который в обычных условиях открывает файл только для чтения и эквивалентен следующему оператору:

filedes := fdopen (filename, Open_RDONLY);

Упражнение 2.1. Создайте небольшую программу, описанную выше. Проверьте ее работу при условии, что файл junk не существует. Затем создайте файл junk с помощью текстового редактора и снова запустите программу. Содержимое файла junk не имеет значения.

2.1.3. Создание файла при помощи вызоваfdopen

Вызов fdopen может использоваться для создания файла, например:

filedes := fdopen('/tmp/newfile', Open_WRONLY or Open_CREAT, octal(0644));

Здесь объединены флаги Open_CREAT и Open_WRONLY, задающие создание файла /tmp/newfile при помощи вызова fdopen. Если /tmp/newfile не существует, то будет создан файл нулевой длины с таким именем и открыт только для записи.

В этом примере вводится третий параметр mode вызова fdopen, который нужен только при создании файла. Не углубляясь в детали, заметим, что параметр mode содержит число, определяющее права доступа (access permissions) к файлу, указывающие, кто из пользователей системы может осуществлять чтение, запись или выполнение файла. В вышеприведенном примере используется восьмеричное значение 0644. При этом пользователь, создавший файл, может выполнять чтение из файла и запись в него. Остальные пользователи будут иметь доступ только для чтения файла. В следующей главе показано, как вычисляется это значение. Для простоты оно будет использовано во всех примерах этой главы.

Следующая программа создает файл newfile в текущем каталоге:

uses linux;

const

PERMS=0644; (* права доступа при открытии с Open_CREAT *)

filename='newfile';

var

filedes:integer;

begin

filedes := fdopen (filename, Open_RDWR or Open_CREAT, octal(PERMS));

if filedes = -1 then

begin

writeln('Не могу создать ', filename);

halt(1); (* выход по ошибке *)

end;

writeln('Файл ', filename, ' успешно создан (открыт для записи), дескриптор равен ',filedes);

(* Остальная программа *)

halt(0);

end.

Что произойдет, если файл newfile уже существует? Если позволяют права доступа к нему, то он будет открыт на запись, как если бы флаг Open_CREAT не был задан. В этом случае параметр mode не будет иметь силы. С другой стороны, объединение флагов Open_CREAT и Open_EXCL (exclusive – исключительный) приведет к ошибке во время вызова fdcreat, если файл уже существует. Например, следующий вызов

fd := fdopen('lock', Open_WRONLY or Open_CREAT or Open_EXCL, octal(0644));

означает, что если файл lock не существует, его следует создать с правами доступа 0644. Если же он существует, то в переменную fd будет записано значение -1, свидетельствующее об ошибке. Имя файла lock (защелка) показывает, что он создается для обозначения исключительного доступа к некоторому ресурсу.

Еще один полезный флаг – флаг Open_TRUNC. При его использовании вместе с флагом Open_CREAT файл будет усечен до нулевого размера, если он существует, и права доступа к файлу позволяют это. Например:

fd := fdopen ('file', Open_WRONLY or Open_CREAT or Open_TRUNC, octal(0644));

Это может понадобиться, если вы хотите, чтобы программа писала данные поверх данных, записанных во время предыдущих запусков программы.

Упражнение 2.2. Интересно, что флаг Open_TRUNC может использоваться и без флага Open_CREAT. Попытайтесь предугадать, что при этом получится, а затем проверьте это при помощи программы в случаях, когда файл существует и не существует.

Существует возможность установить размер файла не только в 0, но и в любое заданное количество байт. Это позволяет сделать функция fdTruncate.

Соседние файлы в папке Полищук, Семериков. Системное программирование в UNIX средствами Free Pascal